0

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

我从 GC 日志中观察到 1-Minor GC 在此期间无法回收任何字节,除了特定时期 Minor GC 回收了几乎 95-99% 的托儿所(保留区域除外)。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 中留下了大量部件。在这个问题上的任何指导

4

1 回答 1

0

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

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

-XXNurseryPartsLimits=0
于 2017-11-01T04:11:36.407 回答