为什么长时间运行的高容量Java应用程序的GC时间会稳定增加?

Jav*_*low 8 java garbage-collection jvm

我有一个高容量的Java应用程序,可以处理50000msgs /秒的一致负载.它使用以下设置调整为高吞吐量:

-Xmx3g -Xms3g -XX:NewSize = 2g -Xss128k -XX:SurvivorRatio = 6 -XX:TargetSurvivorRatio = 90 -XX:+ UseParallelGC -XX:ParallelGCThreads = 12 -XX:+ UseParallelOldGC -XX:+ HeapDumpOnOutOfMemoryError

我发现尽管GC运行的频率保持不变,年轻的GC时间从一天结束时的50毫秒开始稳定上升到200毫秒.

如果我使用ParNewGC收集器尝试相同的运行,GC时间会以更快的速度上升.有没有人对这个问题有任何想法?

Ste*_*n C 3

如果存在内存泄漏,或者内存中的缓存逐渐使用越来越多的内存,这些都会导致 GC 执行更多的工作来跟踪可到达的对象。

其他可能性是:

  • 您有非堆内存泄漏,这会导致分页增加;即,将物理内存页面复制到光盘并复制回来。

  • 某些外部进程消耗的内存量不断增加,导致分页次数增加。

  • 年轻代中生成的对象的性质随着时间的推移而变化,因此需要更多的工作来跟踪可到达的对象。可能只是因为第一批藏品中大部分幸存下来。