关于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。
谁能告诉我为什么伊甸园的规模如此之小?
答案 0 :(得分:2)
伊甸园的大小只有它需要的大小。如果你生成更多的短期垃圾,NewSize会更大。
答案 1 :(得分:2)
从这里this Oracle docs!
我可以理解当堆增长或缩小时,JVM必须重新计算旧的和新的生成大小以维护预定义的NewRatio。
NewSize和MaxNewSize参数控制新一代的最小和最大尺寸。
年轻一代相对于老一代的规模由NewRatio控制。例如,设置-XX:NewRatio = 3意味着旧一代和年轻一代之间的比例是1:3,伊甸园和幸存者空间的总和将是堆的四分之一。
调整Java堆的大小:
为年轻一代提供充足的记忆。默认值是根据NewRatio和-Xmx设置计算的。
您可以尝试为NewSize设置一个值,看看是否有所作为?