我正在调查一个 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 参数,用于设置总堆、新空间和永久空间 ( -Xms -Xmx -XX:NewSize -XX:MaxNewSize -XX:PermSize -XX:MaxPermSize
) 的最小/最大值。但是对旧空间没有设置限制(我不知道这些参数是否存在)。
关于NewRatio的编辑:
这是我的理解,这里也提到JVM 不会强制执行新旧空间之间的比率,尤其是在MaxNewSize
使用参数的情况下。并且该MaxNewSize
参数被接受,因为上面的值 (301056.0KB) 实际上正是我们指定的 294MB MaxNewSize
。此外,NewRatio 的默认值为2(参见此处),这根本不是 jstat 列出的上述任何值之间的比率。