可通过GarbageCollectorMXBean获取GC次数和累计停顿时间;调用ManagementFactory.getGarbageCollectorMXBeans()获取所有GC Bean,遍历并按getName()识别目标收集器;使用getCollectionCount()和getCollectionTime()获取单调递增的累计值,适合差值计算增量;建议缓存Bean引用、定期采集并处理边界情况如未初始化或零计数。

可以通过 GarbageCollectorMXBean 获取 JVM 当前运行中的 GC 次数和累计停顿时间,无需依赖外部监控系统,适合嵌入业务逻辑或轻量级健康检查。
获取所有 GC 收集器 Bean 实例
Java 提供了 ManagementFactory.getGarbageCollectorMXBeans() 方法,返回所有已注册的垃圾收集器 MBean 列表。每个实例对应一种 GC 算法(如 G1 Young Generation、G1 Old Generation),需遍历识别目标收集器。
- 使用
getName()区分不同代或算法,例如"G1 Young Generation"或"ZGC Cycles" - 注意:同一 GC 算法可能暴露多个 Bean(如 ZGC 的 cycle、pause、cleanup),应按名称语义选取
- 建议缓存 Bean 引用,避免每次调用都触发 JMX 查找开销
读取 GC 次数与总停顿时间
每个 GarbageCollectorMXBean 提供两个关键属性:
-
getCollectionCount():自 JVM 启动以来该收集器触发的 GC 次数(long 类型,可能为 -1 表示不支持) -
getCollectionTime():该收集器所有 GC 停顿时间总和(毫秒,long 类型,同样可能为 -1) - 这两个值是单调递增的,适合做差值计算周期内增量(如每 10 秒统计一次新增 GC 次数)
实现简易实时监控逻辑
可封装一个轻量级监控器,定期采集并上报指标:
- 用
ScheduledExecutorService每秒/每 5 秒执行一次采集任务 - 对每个 GC Bean 记录当前
collectionCount和collectionTime,与上一次对比得出增量 - 将结果写入日志、发送到 Prometheus Pushgateway,或更新内部 Metrics 计数器(如 Micrometer 的
Counter或Timer) - 示例片段:gcBean.getCollectionCount() - lastCount 即为本轮新增 GC 次数
注意事项与常见问题
实际使用中需留意以下边界情况:
- 某些 GC(如 Shenandoah、ZGC)可能报告
collectionCount = 0,但仍有停顿;此时应优先关注collectionTime变化 - JVM 启动初期部分 GC Bean 可能尚未初始化,首次采集前建议加空值判断
- 多代 GC(如 ParallelOld)会拆分为多个 Bean,需分别统计再汇总,不能只看其中一个
- 该方式无法获取单次 GC 的详细耗时分布(如 Eden/Survivor/Old 各阶段),如需细粒度分析仍需配合 GC 日志或 JFR

















