Java堆:是什么限制了旧一代的最大容量



我正在研究EE应用程序的性能问题,这些问题可能是由于垃圾回收器的优化程度不够。

在查看我在重载下收集的jstat日志时,我偶然发现了以下发现:

S0     S1     E      O      P
7.39   0.00   41.81  88.89  53.93
NGCMN     NGCMX     NGC       S0C      S1C   
131072.0  301056.0  301056.0  30080.0  30080.0 
EC        OGCMN      OGCMX       OGC      
240896.0  1441792.0  2058240.0   2058240.0

根据这里的官方jstat文档,我们可以看到当前的旧一代大小(OGC)已经达到了最大旧一代尺寸(OGCMX。然而,第一行告诉我们,"旧空间利用率占空间当前容量的百分比"(O)"仅"为88%。

我的问题是:

  • 是什么机制在jstat输出中将旧的一代限制设置为OGCMX
  • 是什么阻止了旧空间的增长和使用剩余的约12%的堆

我们有JVM参数,用于设置总堆、新空间和perm空间(-Xms -Xmx -XX:NewSize -XX:MaxNewSize -XX:PermSize -XX:MaxPermSize)的最小值/最大值。但对旧空间没有限制(我不知道是否存在这样的参数)。


编辑有关新比率
据我所知,这里也提到JVM不强制执行新旧空间之间的比率,尤其是在使用MaxNewSize参数的情况下。并且接受MaxNewSize参数,因为上面的值(301056.0KB)实际上正是我们为MaxNewSize指定的294MB。此外,NewRatio的默认值是2(请参阅此处),这根本不是jstat列出的任何上述值之间的比率。

我觉得这个问题非常重要。我一直在寻找完全相同的答案。就我而言,情况更糟。我们有6GB作为Xmx,gccapacity选项的输出显示它使用了几乎100%的内存:

[ec2-user@ip ~]$ sudo jstat -gccapacity 2416
OGCMX: 6121088.0
OGC:   6084776.0

以及gcutil选项的输出:

[ec2-user@ip ~]$ sudo jstat -gcutil 2416
  S0     S1     E      O      P     YGC 
  0.00 100.00  26.01  58.81  59.90   8555

这意味着它应该只使用大约59%的老一代。我不明白。这意味着JVM即使没有使用它,也会占用全部容量…

相关内容

  • 没有找到相关文章

最新更新