【发布时间】:2017-08-25 14:48:48
【问题描述】:
我无法找到监控 JVM GC 内存耗尽问题的方法。
使用串行 GC,我们可以查看完整的 GC 暂停时间,并很好地了解 JVM 是否出现问题(例如,如果它花费了几秒钟以上)。
CMS 的行为似乎有所不同。
从java.lang:type=GarbageCollector,name=ConcurrentMarkSweep MXBean(通过JMX)查询lastGcInfo 时,报告的持续时间是所有GC 步骤的总和,通常为几秒。这并不表示 GC 存在问题,相反,我发现太短的 GC 时间通常更多地表明存在问题(例如,如果 JVM 进入 CMS-concurrent-mark-start-> @987654324 @循环)。
我也尝试过jstat,它给出了垃圾收集所花费的累积时间(不确定它是用于旧 GC 还是新 GC)。这可以绘制成图表,但用于监控目的并非易事。例如,我可以解析jstat -gccause 输出并计算随时间的差异,并跟踪+监控(例如,在过去 X 分钟内进行 GC 所花费的时间)。
我将以下 JVM 参数用于 GC 日志记录:
-Xloggc:/xxx/gc.log
-XX:+PrintGCDetails
-verbose:gc
-XX:+PrintGCDateStamps
-XX:+PrintReferenceGC
-XX:+PrintPromotionFailure
如果没有其他可用的,解析 gc.log 也是一种选择,但最佳解决方案是使用 java-native 方式来获取相关信息。
信息必须是机器可读的(以发送到监控平台),因此不能使用可视化工具。我正在运行混合了 JDK 6/7/8 实例的生产环境,因此与版本无关的解决方案更好。
是否有一种简单的方法来监控 CMS 垃圾收集?我应该查看哪些指标?
【问题讨论】:
-
您可以使用启用 GC 日志记录的 JVM 选项吗?
-
是的,我已经在使用它们(问题已更新),但 gclog 解析是最后的解决方案,我想先用尽所有惯用方法。
标签: java memory-leaks garbage-collection jvm monitoring