jstat查看进程gc情况,参数速查
已于 2026年08月11日 10:40 修改
访问次数:0
| 标头 | 含义 | 怎么看 |
|---|---|---|
| S0 | Survivor 0 已使用百分比 | 与 S1 交替使用;GC 后一个通常接近 0 |
| S1 | Survivor 1 已使用百分比 | 与 S0 交替使用;GC 后一个通常接近 0 |
| E | Eden 已使用百分比 | 正常情况下不断上涨,Young GC 后明显下降 |
| O | Old 已使用百分比 | 重点关注;GC 后如果持续单调上涨,可能存在晋升压力或内存泄漏 |
| M | Metaspace 已使用百分比 | 类加载增加时上涨;长期持续上涨需关注类加载泄漏 |
| CCS | Compressed Class Space 已使用百分比 | 存放压缩类元数据;通常与 Metaspace 一起观察 |
| YGC | Young GC 次数 | 累计次数;单看次数意义有限,应结合运行时间和 GC 间隔 |
| YGCT | Young GC 累计耗时(秒) | YGCT / YGC 可估算平均 Young GC 停顿时间,但不是严格的 P99/最大停顿 |
| FGC | Full GC 次数 | 需要重点关注,但不能简单认为非 0 就异常 |
| FGCT | Full GC 累计耗时(秒) | 与 FGC 一起看;平均值不能代表最大停顿 |
| CGC | Concurrent GC 次数 | 不是所有版本/收集器都会出现,具体含义取决于 JVM 版本和 GC |
| CGCT | Concurrent GC 累计耗时(秒) | 与 CGC 配合观察 |
| GCT | GC 总累计耗时(秒) | 通常是 Young/Full/Concurrent 等 GC 时间的汇总指标 |
最重要的误区
1. O 不是“越低越健康”
真正值得关注的是:
Full GC / Old GC 后,Old 区是否能够明显下降,以及下降后的基线是否持续上涨。
例如:
GC #1: O = 35%
GC #2: O = 42%
GC #3: O = 51%
GC #4: O = 60%
GC #5: O = 69%
如果每次 GC 后的 Old 使用率都在抬高,就比某一个时刻的 O=70% 更值得警惕。
2. YGCT / YGC < 50ms 不能作为通用“健康标准”
例如:
YGC = 10,000
YGCT = 300 秒
平均 Young GC = 30ms
这只能说明平均值约为 30ms,不能说明所有 GC 都低于 50ms。
可能实际上是:
绝大多数:5~10ms
少数:500ms
平均值仍然可能看起来不错。
生产环境更应该结合 GC 日志观察:
- 平均停顿
- Max Pause
- P95/P99
- GC 频率
- 每次 GC 回收了多少内存
3. GCT < 总运行时间 5% 也不是硬性健康线
例如 JVM 运行 10 小时:
GCT = 20 分钟
GC 时间占比约:
20 / 600 = 3.3%
但如果这 20 分钟是大量短暂停顿,应用可能仍然正常;反过来,即使 GC 总时间只有 1%,如果存在一次 10 秒 STW Full GC,用户体验也可能已经严重受影响。
所以:
GC 总耗时适合看 GC 开销,不能单独代表 GC 对应用的影响。
实战中建议重点看这几个组合
E + YGC + YGCT
↓
Young GC 是否过于频繁?
Young GC 平均耗时是否增加?
O + FGC + FGCT
↓
Old 区是否持续上涨?
是否频繁 Full GC?
Full GC 是否越来越慢?
M + CCS
↓
类加载/卸载是否异常?
Metaspace 是否持续增长?
以及最重要的:
GC 日志 / JFR
↓
实际 STW 停顿时间
P95 / P99 / Max Pause
GC 原因
回收前后堆大小
评论(0)