频繁的 Full GC 和 Minor GC 期间的零回收

Frequent Full GC & Zero Reclaim During MInor GC

在我的一个生产应用程序中,我们使用 Oracle JRockit 作为 JVM。次要 GC 频率非常高(大约每 40 秒一次)。但有时我们会看到频繁的 Full GC 发生,而在此期间 Minor GC 也会回收可忽略不计的字节。导致应用程序失败,因为我们的应用程序需要在 1 秒内响应,而完整的 GC 暂停时间超过 1 秒。

我对 GC 日志有一些观察 1- Minor GC 在此期间无法回收任何字节,特定时期除外 Minor GC 回收几乎 95-99% 的 nursery(保留区域除外)。 2- 我正在观察请求紧急并行扫描 在此压缩阶段

我的堆配置是

Heap            : 10 GB
Nursery         : 1GB
GC              : gencon
Keeparea        : 50%
CompactionRatio : 10%
gcTrigger       : 40%

我们尝试将 Nursery 大小更改为 2GB 和 3GB,问题频率随着 2GB 的增加而降低,随着 3GB 的增加而增加

关于为什么会导致此问题或如何进一步调查此问题的任何帮助

更新 1:

我为 GC 启用了 memdbg 模块,发现触发了 Full GC,因为 Nursery 部件高于默认限制 10000,但我可以看到 OC 也将大量部件留在 nursery 中。关于此事的任何指导

所以我们解决了它,为了深入了解问题,我们启用了详细的 memdbg 模块,它为我们提供了触发 GC 的原因的信息。完整 GC 因分配请求失败而触发,根据 Oracle 文档,当堆的托儿部分碎片化时会发生这种情况,因为他们从 R28.2.5 添加了一个检查,以检查每个次要 GC 期间托儿所中的整体部分,如果它超过定义的limit (default is 10K) Minor GC 将被中止并触发 Full GC,原因是分配请求失败。

为了解决这个问题,我们添加了以下参数来禁用此检查,之后系统工作正常。

-XXNurseryPartsLimits=0