我正在研究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即使没有使用它,也会占用全部容量…