jstat 是 jdk 自带的轻量级 jvm 监控工具,无需代理或修改配置,可快速查看堆内存使用和 gc 行为;支持 -gc、-gccause、-gcutil 等选项,用于分析各代内存占用、gc 次数与耗时,是生产环境排查内存问题的首选工具。

jstat 是 JDK 自带的轻量级 JVM 统计监控工具,无需启动额外代理或修改应用配置,适合在生产环境快速查看堆内存使用和 GC 行为。它不侵入应用、无性能开销,是排查内存问题的第一步。
获取目标 Java 进程 PID
运行 jstat 前必须知道目标 JVM 的进程 ID(PID):
- Linux/macOS:执行 jps -l 或 ps aux | grep java 查看进程列表
- Windows:执行 jps -l(需确保 JAVA_HOME/bin 在 PATH 中)
- 注意区分多个 Java 进程,可通过主类名或启动参数辅助识别
常用 jstat 命令格式与关键选项
基本语法:jstat [options]
- -gc:显示堆各区域(Eden、S0/S1、Old、Metaspace)容量、已用空间、GC 次数与耗时(推荐首选)
- -gccause:同 -gc,额外显示最后一次 GC 的原因(如 Allocation Failure、System.gc())
- -gcutil:以百分比形式展示各区域使用率,更直观,适合快速巡检
- -t:在每行开头添加时间戳(从 JVM 启动开始的秒数),便于关联日志
- 例如:jstat -gc -t 12345 2000 5 表示每 2 秒输出一次 GC 统计,共 5 次
解读关键字段含义(以 -gc 输出为例)
重点关注以下列(不同 JDK 版本字段略有差异,JDK 8+ 主要含):
- S0C / S1C:Survivor0/1 区当前容量(KB)
- EC / OC / MC / CCSC:Eden、Old、Metaspace、Compressed Class Space 容量
- S0U / EU / OU / MU / CCU:对应区域当前已用空间(KB)
- YGC / YGCT:Young GC 次数与总耗时(秒)→ 数值持续上涨说明频繁新生代回收
- FGC / FGCT:Full GC 次数与总耗时 → 出现增长需警惕(尤其 Old 区使用率长期 >70%)
- GCT:所有 GC 总耗时,占应用运行时间比例过高(如 >10%)表明 GC 压力大
实战建议与注意事项
- 首次观察建议用 jstat -gccause
1000 (每秒刷新),关注是否频繁触发 Young GC 及原因 - 若发现 FGC 增长,结合 jstat -gcutil
5000 看 Old 区使用率是否缓慢爬升(可能内存泄漏)或突增后回落(大对象直接进老年代) - JDK 11+ 默认使用 G1,可加 -gcnew 或 -gcold 查看分代细节;ZGC/Shenandoah 不适用传统分代统计,jstat 支持有限
- 注意单位统一为 KB,计算使用率可用 (EU + S0U + S1U) / (EC + S0C + S1C) 估算新生代占用比
- 避免高频采样(如间隔
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











