HotSpot JVM会动态改变年轻代的大小吗?

时间:2014-10-28 12:17:15

标签: java garbage-collection jvm jvm-hotspot

关于HotSpot JVM垃圾收集的一些问题。

我们正在运行一个java进程,而opts是:

-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps 
-Xloggc:/mnt/dfs/0/hdfs/logs/namenode.gc.log -XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=1 -XX:GCLogFileSize=512M -XX:+UseParNewGC -XX:+UseConcMarkSweepGC 
-XX:+CMSParallelRemarkEnabled -XX:-DisableExplicitGC -XX:+UseCMSCompactAtFullCollection 
-XX:+CMSClassUnloadingEnabled -XX:+UseCMSInitiatingOccupancyOnly -server -Xmx92160m -Xms92160m 
-Xss256k -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=15 -XX:+PrintTenuringDistribution

如您所见,最大堆大小约为90G。

根据this article,NewRatio = 2,SurvivorRatio = 8。所以伊甸园  尺寸应为90G * 1/3 * 8/10 = 24G,幸存者尺寸应为90G * 1/3 * 1/10 = 3G。

但事实上,当我使用jstat时:

sudo jstat -gcnew 37082
S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
48960.0 48960.0    0.0 5981.3 15  15 24480.0 391936.0  82332.7  13351 1379.450

伊甸园大小只有390MB左右,幸存者大小只有48MB。这导致了很多年轻的gc。

谁能告诉我为什么伊甸园的规模如此之小?

2 个答案:

答案 0 :(得分:2)

伊甸园的大小只有它需要的大小。如果你生成更多的短期垃圾,NewSize会更大。

答案 1 :(得分:2)

从这里this Oracle docs

  

我可以理解当堆增长或缩小时,JVM必须重新计算旧的和新的生成大小以维护预定义的NewRatio。

     

NewSize和MaxNewSize参数控制新一代的最小和最大尺寸。

     

年轻一代相对于老一代的规模由NewRatio控制。例如,设置-XX:NewRatio = 3意味着旧一代和年轻一代之间的比例是1:3,伊甸园和幸存者空间的总和将是堆的四分之一。

调整Java堆的大小:

  

为年轻一代提供充足的记忆。默认值是根据NewRatio和-Xmx设置计算的。

您可以尝试为NewSize设置一个值,看看是否有所作为?