我有一个大容量 Java 应用程序,它处理 50000 条消息/秒的一致负载。它使用以下设置针对高吞吐量进行了调整:
我发现年轻的 GC 时间从开始时的 50 毫秒稳步上升到一天结束时的 200 毫秒,尽管 GC 运行的频率保持不变。
如果我使用 ParNewGC 收集器尝试相同的运行,GC 时间会以更快的速度增加。有没有人对这个问题有任何想法?
最佳答案
如果您有内存泄漏,或者内存中的缓存逐渐使用越来越多的内存,这些都会导致 GC 做更多的工作来跟踪可访问的对象。
其他可能性是:
您有非堆内存泄漏,这会导致分页增加;即,将物理内存页面复制到磁盘并返回。
一些外部进程正在消耗越来越多的内存,导致分页增加。
年轻代中生成的对象的性质会随着时间发生变化,因此需要做更多的工作来追踪可达对象。可能仅仅是因为它们中有更大比例的人在第一次收集后幸存下来。
关于java - 为什么 GC 时间在长时间运行的高容量 Java 应用程序上稳步增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3675106/