【问题标题】:Will HotSpot JVM change young generation size dynamically?HotSpot JVM 会动态改变年轻代的大小吗?
【发布时间】:2014-12-23 20:18:21
【问题描述】:

关于 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。所以伊甸园 size应该是90G*1/3*8/10=24G,survivor size应该是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

Eden 大小只有 390MB 左右,幸存者大小只有 48MB。这会导致很多年轻的gc。

谁能告诉我为什么伊甸园这么小?

【问题讨论】:

  • 我知道默认情况下所有代大小都在动态调整。由于您的任何选择似乎都无法改变这一点,因此这可能也是您应该拥有的。我建议使用 VisualGC 来监控它(它是 VisualVM 的一个可选插件)。

标签: java garbage-collection jvm jvm-hotspot


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    从这里this Oracle docs

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

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

    新生代相对于老年代的大小由NewRatio控制。例如,设置 -XX:NewRatio=3 表示老年代和年轻代的比例为 1:3,伊甸园和幸存者空间的组合大小将是堆的四分之一。

    要调整 Java 堆的大小:

    为年轻一代提供足够的内存。默认值是根据 NewRatio 和 -Xmx 设置计算得出的。

    您能否尝试为 NewSize 设置一个值,看看是否有影响?

    【讨论】:

      猜你喜欢
      • 2020-05-16
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      相关资源
      最近更新 更多