关于jvm参数:-XX:SurvivorRatio的坑
坑1:
-XX:SurvivorRatio
表示新生代Eden区域和Survivor区域(From幸存区或To幸存区)的比例,默认为8,表示Eden区域与其中一个Survivor区域的比例为8:1,即Eden区域与From区域与to区域的比例为8:1:1
比如设置-Xmn=100m
来指定新生代大小的为100M,Eden区域的大小为100M*8/(8+1+1)=80M,From区域和To区域分别为10M。
如果手动设置-XX:SurvivorRatio=4
,-Xmn=600m
,那么Eden区域与From区域与To区域的比例为4:1:1,因此,Eden区域大小为600*4/(4+1+1)=400M,From区域和To区域分别为100M。
坑:这里容易误解为Eden区域为600*6/10=360M
坑2:
idea在配置启动参数-XX:SurvivorRatio
时不生效的问题,是因为JDK 1.8 默认使用 UseParallelGC 垃圾回收器,该垃圾回收器默认启动了 AdaptiveSizePolicy(自适应大小策略),会根据GC的情况自动计算计算 Eden、From 和 To 区的大小;要使-XX:SurvivorRatio
生效,就需要关闭该策略 -XX:-UseAdaptiveSizePolicy
。
注意:
- 在 JDK 1.8 中,如果使用 CMS,无论 UseAdaptiveSizePolicy 如何设置,都会将 UseAdaptiveSizePolicy 设置为 false;不过不同版本的JDK存在差异;
- UseAdaptiveSizePolicy不要和SurvivorRatio参数显示设置搭配使用,一起使用会导致参数失效;
- 由于AdaptiveSizePolicy会动态调整 Eden、Survivor 的大小,有些情况存在Survivor 被自动调为很小,比如十几MB甚至几MB的可能,这个时候YGC回收掉 Eden区后,还存活的对象进入Survivor 装不下,就会直接晋升到老年代,导致老年代占用空间逐渐增加,从而触发FULL GC,如果一次FULL GC的耗时很长(比如到达几百毫秒),那么在要求高响应的系统就是不可取的。