在我的一个生产应用程序中,我们使用Oracle JRockit作为JVM。次要GC频率非常高(大约每40秒)。但是有一段时间我们看到频繁的Full GC发生,在那段时间内,Minor GC也回收了可忽略不计的字节。导致应用程序应用程序失败,因为我们的应用程序需要在1秒内响应并且完整的GC暂停时间超过1秒。
我从GC日志中得到了一些观察 1-次要GC在此期间无法回收任何字节,除特定时期外,次要GC回收了近95-99%的托儿所(保留区域除外)。 2-我正在观察请求紧急并行扫描在此压缩阶段
我的堆配置
Heap : 10 GB
Nursery : 1GB
GC : gencon
Keeparea : 50%
CompactionRatio : 10%
gcTrigger : 40%
我们尝试将幼儿园大小改为2GB& 3GB,发行频率下降2GB,增加3GB
为什么会出现此问题或如何进一步调查此问题的任何帮助
更新1:
我为GC启用了memdbg模块,发现Full GC被触发,因为Nursery部件高于默认限制10000,但我可以看到OC也在托儿所留下了大量的部件。关于此事的任何指导
答案 0 :(得分:0)
所以我们得到了解决,为了深入解决问题,我们启用了详细的memdbg模块,它给出了GC被触发的原因。完整的GC因为分配请求失败而陷入困境,根据Oracle文档,当堆的托儿所部分碎片化时,因为他们在每个次要GC期间添加了来自R28.2.5的检查以检查托儿所中的整体部分以及是否超过定义限制(默认为10K)轻微GC将被中止,并且原因分配请求失败将触发Full GC。
要解决此问题,我们添加了以下参数来禁用此检查,之后系统正常运行。
-XXNurseryPartsLimits=0