JVM堆内存参数设置

-Xmx:最大堆大小

-Xms:初始堆大小

-Xmn:年轻代大小

-XXSurvivorRatio:年轻代中Eden区与1个Survivor区的大小比值(默认Eden:from Survivor:to Survivor=8:1:1)

如:-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3

 

当我们并发访问量比较,会快速产生大量的垃圾对象,此时为了防止大量的垃圾对象被放入老年代,最终把老年代占满,最后导致频繁的STW,表现出来的效果是系统的核心业务模块比较卡顿,可以考虑增加年轻代区域,尤其是两个Survivor;

因为JVM的对象由新生代升级至老年代由以下条件决定:

1.对象会优先分配在Eden区域,当Eden区域的内存区间不够分配时,会发生MinorGC,GC期间虚拟机如果发现Eden中存活的对象无法完全放入Survivor空间,会通过分配担保机制提前转移到老年代(图片来源与深入立即java虚拟机)

2.大对象(需要大量连续内存空间的java对象)有可能会被直接放入老年代

通过-XX:PretenureSizeThreshold设置,令大于这个设置值的对象直接在老年代分配

3.长期存活的对象会进入老年代,JVM中在新生代中每经历一次Minor GC,会默认这个对象年龄+1,默认情况下若年龄超过15的对象会被移入老年代

通过-XX:MaxTenuringThreshold=15来设置年轻代年龄超过多少要进入老年代

4.为了适应不同程序的内存情况,虚拟机并不是永远要求年龄必须达到了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无需等到MaxTenuringThreshold中要求的年龄(该原因在很多大促等情况下,会产生大量的垃圾对象,年龄相同,此时就需要独立配置)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章