简体中文
JVM 性能监控指标:GC 该看哪几个数
"我的 JVM 健不健康"不是靠感觉,而是靠几个数字。以下就是生产环境值得盯的 GC 指标、各自的含义,以及不令人担心的健康范围。
1. GC 吞吐量
是什么:总时间里应用线程(而非回收线程)运行的占比。
吞吐量 = (总时间 - 总GC时间) / 总时间 × 100%健康值:延迟敏感服务 ≥ 95%;批处理可以更低。低于 90% 意味着十分之一的 CPU 花在回收上——该调优了。
2. 停顿时间(平均 / P99 / 最大)
是什么:stop-the-world 回收时,JVM 停住所有应用线程的时长。
健康值:取决于 SLO——平均 50ms 以内比较从容;最大停顿超过 1s 无论如何都值得排查。看 P99 而不只是平均值,用户感受到的是长尾。
3. 回收次数(Young vs Full)
是什么:日志时间窗内发生了多少次 Minor 和 Major 回收。
健康值:Young GC 频繁是正常的(对象朝生夕死);Full GC 次数应为 0——每次 Full GC 都停整个 JVM,是最昂贵的回收。反复出现说明老年代压力过大。
4. 对象分配速率
是什么:应用创建对象的速度(MB/s),由两次回收之间年轻代的填充速度推算。
健康值:没有绝对标准——盯变化。发版后速率突增,往往就是新 GC 压力的来源。
5. 晋升速率
是什么:对象挺过年轻代、进入老年代的速度(MB/s)。
健康值:低而稳定。晋升速率上升会加速填满老年代 → Full GC 增多。只有 Java 8 风格的详细日志能算出该值。
6. GC 后堆占用
是什么:每次回收后还剩多少堆——即存活数据需要的"底仓"。
健康值:稳定在某个区间波动。GC 后占用逐级抬升是典型的内存泄漏信号。
7. 回收的 CPU 时间
是什么:GC 线程消耗的 user / sys / real 时间(日志里 [Times: user=… sys=… real=…])。
健康值:并行回收器下 user ≈ real × 核数;sys 偏高可能是缺页或 NUMA 影响。
一次分析拿到全部指标
这 7 个指标正是 EasyGC 报告从一份 GC 日志里算出来的全部内容——不需要 Agent,不需要接 APM:
相关文章
- 如何解读分析报告 — 每个区块详解
- JVM 性能优化指南 — 指标异常时改什么
- 开启 GC 日志 — 这些数字从哪里来