在我的一个生产应用程序中,我们使用Oracle作为JRockit。较小的GC频率很高(大约。每40秒)。但是有一段时间,我们经常看到完整的GC发生,在此期间,小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模块,并发现由于苗圃部件高于默认限制10000,所以触发了完整的GC,但是我可以看到OC也在苗圃中留下了大量的部件。在此问题上的任何指导
发布于 2017-11-01 04:11:36
所以我们解决了这个问题,为了深入研究这个问题,我们启用了详细的memdbg模块,它为我们提供了为什么会触发GC的信息。完全GC与原因分配请求失败有关,根据Oracle文档,当堆的托儿所部分被分割时会发生,因为它们从R28.2.5中添加了一项检查,以便在每个次要GC期间检查苗圃中的总体部件,如果超过定义的限制(默认值为10K),将中止小GC,并在分配请求失败的情况下触发完整的GC。
为了解决这个问题,我们添加了下面的参数来禁用此检查,在此之后系统正常工作。
-XXNurseryPartsLimits=0https://stackoverflow.com/questions/46442849
复制相似问题