jvm之堆

jvm之堆,第1张

jvm之堆

一。概述:

 

 二、堆内存细分:

 从逻辑上jvm堆上包含方法区,但实际上 只包含 新生代和老年代

例子:

从上面的例子可知:Eden+S0+S1+Old Gen = 10M

jdk1.8和jdk1.8之前方法区的对比:

验证:

 三、堆内存大小设置和查看

a.设置堆空间大小的参数:

-Xms 用来设置堆空间(年轻代+老年代)的初始内存大小

        -X 是jvm的运行参数

        ms 是memory start

-Xmx 是用来设置堆空间(年轻代+老年代)的最大内存大小。

b.默认堆空间的大小:

初始内存大小:物理电脑内存的 64分之1

最大内存大小:物理电脑内存大小的 4分之1

c.开发中建议将-Xms 和Xmx 设置成一样的值:因为避免频繁的扩展和降低内存对系统造成不必要的压力。

 这里将-Xms 和-Xmx 设置成600m 为什么显示的是575m:

因为只包含一个survivor 区。

d.查看设置的参数:

方式一:jps 查看到进程号,然后根据 jstat -gc 进程号

方式二:-XX+PrintGCdetails。

 四、年轻代和老年代细分及设置大小:

 

 

根据 -XX:NewRatio=2   (一般不会调动)设置新生代和老年代的比例。

可以根据jinfo -flag NewRatio 进程号  查看。

 根据 -XX:SurvivorRatio=8 (默认)设置Eden 和S0 和 S1 的比例。

 根据jvisualvm查看Eden和S0 和S1的比例是 6:1:1

原因是 自适应(-XX:+UserAdaptiveSizePolicy(默认有这个参数,去掉就好了))

 -Xmn 设置新生代大小。(一般设置用NewRatio 设置比例)

五、图解对象分配过程:

a、概述:

b、图解:

 

 注:红色的是垃圾,绿色的不是垃圾。

        S0 中绿色对象的 “1” 是年龄计数器。

        谁空谁是to。

        Eden区满的时候触发YGC S0和S1区满的时候不会触发YGC。

 

设置晋升老年代的阈值: -XX:MaxTenuringThreshold=15(默认是15)晋升到老年代。

c、总结:

六、对象分配过程特殊情况:

七:内存分配策略:

 验证大对象直接进入老年代:

 

 说明一下空间分配担保:

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5686800.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存