jstat是无需安装、不依赖JMX、不改启动参数的秒级GC实时观测工具;需用jps -l精准获取PID;-gccause比-gc多出LGCC/CGCC列,直指GC根因;单位默认KB,间隔单位为毫秒,推荐加-h3和-t提升可读性;-class可识别类加载泄漏,Loaded持续增长且Unloaded为0是危险信号。

jstat 不需要安装、不依赖 JMX、不修改 JVM 启动参数,只要进程在跑,就能立刻看到 GC 实时状态。它不是“事后分析”工具,而是秒级可观测的第一手诊断入口。
怎么快速拿到目标 Java 进程的 PID
没 PID 就没法用 jstat,而错选进程会导致所有后续观察完全失真。
- 优先用
jps -l:输出简洁,带完整主类或 jar 路径,比如12345 /opt/app.jar,一眼能确认是不是你的服务 - 慎用
ps -ef | grep java:容易匹配到其他 Java 进程(如 IDE、Maven 编译进程),尤其在容器化环境里,PID 变化快,grep结果不可靠 - 如果 JVM 启用了
-Dcom.sun.management.jmxremote,jstat仍只认 PID,不走 JMX 端口——这点常被误以为要配远程地址
jstat -gc 和 jstat -gccause 的核心区别在哪
只看 -gc 容易漏掉关键线索:你知道 GC 发生了,但不知道“为什么发生”。-gccause 才是定位根因的关键跳板。
-
jstat -gc 12345 1000 5输出的是容量、使用量、YGC/FGC 次数与耗时,但最后一列是GCT(总耗时),没有触发原因 -
jstat -gccause 12345 1000 5多出一列LGCC(Last GC Cause)和CGCC(Current GC Cause),值如Allocation Failure、Metadata GC Threshold、Ergonomics——这些直接对应堆配置、元空间泄漏、JVM 自适应策略等真实问题场景 - 例如看到
FGC次数缓慢上升,同时LGCC长期是Metadata GC Threshold,基本可锁定元空间不足或类加载泄漏,而不是老年代内存溢出
单位、间隔、表头这些细节怎么不踩坑
jstat 默认单位是 KB,数值大时肉眼难判断百分比;采样间隔写错单位(比如漏写 s)会导致命令卡死或输出爆炸;表头不刷新又会让滚动日志无法对齐列名。
- 间隔单位默认是毫秒:
2000是 2 秒,2s也是 2 秒,但2是 2 毫秒——高频采样可能压垮小规格机器,生产环境建议不低于500ms - 加
-h3表示每 3 行输出一次表头,避免滚动后找不到各列含义;加-t会在首列加时间戳(从 JVM 启动起算的秒数),方便对齐其他日志时间线 - 数值太大时别硬算百分比,改用
jstat -gcutil:它直接输出 S0、E、O、M 等列的使用率(%),更直观,但会丢失原始容量值,需按需切换 - 如果执行时遇到
Could not attach to process,大概率是目标 JVM 启用了-XX:+PerfDisableSharedMem,需临时关闭该参数或换用jcmd+VM.native_memory辅助验证
类加载异常怎么通过 jstat -class 快速识别
类泄漏不会立刻 OOM,但会持续蚕食元空间,最终触发频繁 Full GC 或 java.lang.OutOfMemoryError: Metaspace。它往往藏在热部署、OSGi、自定义 ClassLoader 场景里,jstat -class 是最轻量的探测器。
- 关注三组数字:
Loaded(已加载类数)、Unloaded(已卸载类数)、Time(类加载耗时) - 健康信号:
Loaded基本稳定,Unloaded> 0 且有规律波动(如 Spring Boot DevTools 热替换时) - 危险信号:
Loaded持续单向增长,Unloaded长期为 0 —— 特别当Bytes(类占用字节数)同步上涨,基本可断定存在类加载器泄漏(比如 ThreadLocal 持有旧 ClassLoader) - 此时不要只盯
jstat,立刻补一手jmap -histo:live 12345 | head -20,看是否有大量org.springframework.boot或sun.reflect相关匿名类堆积
jstat,而是在 YGC 次数突增时,分清是 Eden 区太小、对象分配过快,还是 Survivor 区太小导致提前晋升;是在 FGC 出现时,快速判断是元空间告急、大对象直入老年代,还是 CMS 并发失败。这些判断依赖对字段含义的肌肉记忆,以及把 jstat 输出和 JVM 启动参数(如 -Xmn、-XX:MetaspaceSize)即时对照的能力——而不是背命令。


















