关于HotSpot JVM垃圾收集的一些问题。
我们有一个java进程在运行,选项是:
-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。因此,Eden大小应为90G*1/3*8/10=24G,survivor大小应为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。
谁能告诉我为什么伊甸园这么小?
发布于 2014-10-31 07:13:29
伊甸园的大小只有它需要的大小。如果您生成更多短暂的垃圾,NewSize将会更大。
发布于 2014-10-31 08:47:53
从这里开始这个this Oracle docs!
我可以理解当堆增大或缩小时,JVM必须重新计算新旧两代的大小以维护预定义的NewRatio。
NewSize和MaxNewSize参数控制新一代的最小和最大大小。
年轻一代相对于老一代的大小由NewRatio控制。例如,设置-XX:NewRatio=3意味着老一代和年轻一代之间的比例是1:3,eden和survivor空间的组合大小将是堆的第四。
要调整Java堆大小,请执行以下操作:
为年轻一代提供了大量的内存。默认值由NewRatio和-Xmx设置计算得出。
您是否可以尝试为NewSize设置一个值,看看是否会有所不同?
https://stackoverflow.com/questions/26608136
复制相似问题