java - 为什么 GC 时间在长时间运行的高容量 Java 应用程序上稳步增加?

标签 java garbage-collection jvm

我有一个大容量 Java 应用程序,它处理 50000 条消息/秒的一致负载。它使用以下设置针对高吞吐量进行了调整:

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

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

最佳答案

如果您有内存泄漏,或者内存中的缓存逐渐使用越来越多的内存,这些都会导致 GC 做更多的工作来跟踪可访问的对象。

其他可能性是:

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

  • 一些外部进程正在消耗越来越多的内存,导致分页增加。

  • 年轻代中生成的对象的性质会随着时间发生变化,因此需要做更多的工作来追踪可达对象。可能仅仅是因为它们中有更大比例的人在第一次收集后幸存下来。

关于java - 为什么 GC 时间在长时间运行的高容量 Java 应用程序上稳步增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3675106/

相关文章:

java - 如何在 Vertx 中编写异步文件处理程序

java - 我的应用程序在尝试直接从 URL 读取时崩溃

java - 有没有办法告诉 JVM 当前正在使用哪种 GC 算法

java - 为什么java的-verbose :class argument include jre inherent native classes?没有

Java 类加载器和内存管理

java - 边框布局中的文本区域最大尺寸

java - 使用 SQLite 数据库时我的 Activity 无法打开

c - 使用 C API 的弱表和 GC 终结器

Java - 为什么 GC 时间会随着堆的增长(就容量而言)而增加?

java - 现代 Java 如何优化自分配?