jcmd
jcmd 是 JDK 7 引入的多合一诊断命令行工具,可向目标 JVM 发送各类诊断命令,覆盖线程、堆、GC、JFR、类加载等几乎所有运行时信息,是生产环境排障的首选命令行工具。
基本用法
# 列出所有 Java 进程(类似 jps)
jcmd
# 查看某个进程支持的所有命令
jcmd <pid> help
# 执行指定命令
jcmd <pid> <Command> [options]常用命令速查
线程
# 线程快照(等同 jstack)
jcmd <pid> Thread.print
# 带锁信息的线程快照
jcmd <pid> Thread.print -l堆与内存
# 堆使用摘要
jcmd <pid> GC.heap_info
# 按类统计堆内对象(类似 jmap -histo)
jcmd <pid> GC.class_histogram
# 导出完整堆快照(hprof 格式)
jcmd <pid> GC.heap_dump /tmp/heap.hprof
# 触发一次 Full GC
jcmd <pid> GC.run类加载
# 已加载类的统计
jcmd <pid> VM.class_stats
# 打印类加载器层次
jcmd <pid> VM.classloaders
# 打印系统属性
jcmd <pid> VM.system_properties
# 打印 JVM 启动参数
jcmd <pid> VM.flagsJava Flight Recorder(JFR)
# 开始录制
jcmd <pid> JFR.start name=rec1 duration=60s filename=/tmp/rec.jfr
# 查看录制状态
jcmd <pid> JFR.check
# 停止并保存
jcmd <pid> JFR.stop name=rec1 filename=/tmp/rec.jfr
# 导出正在进行的录制快照
jcmd <pid> JFR.dump name=rec1 filename=/tmp/snap.jfr其他
# 打印 VM 版本信息
jcmd <pid> VM.version
# 打印原生内存使用(需 -XX:NativeMemoryTracking=summary 启动)
jcmd <pid> VM.native_memory summary
# 打印代码缓存使用
jcmd <pid> Compiler.codecache
# 查看 VM uptime
jcmd <pid> VM.uptime与其他工具的对比
| 需求 | jcmd 命令 | 等价旧工具 |
|---|---|---|
| 线程快照 | Thread.print | jstack |
| 堆对象统计 | GC.class_histogram | jmap -histo |
| 堆转储 | GC.heap_dump | jmap -dump |
| JVM 参数 | VM.flags | jinfo -flags |
| 系统属性 | VM.system_properties | jinfo -sysprops |
| 触发 GC | GC.run | — |
| JFR 录制 | JFR.* | jfr 命令 |
jcmd 是 Oracle 推荐的统一诊断入口,官方逐步将旧工具(jmap、jinfo 等)标记为 deprecated。
原生内存追踪(NMT)
NMT 可精确追踪 JVM 各模块的 Native 内存分配,定位堆外内存泄漏:
# 启动时开启 NMT
java -XX:NativeMemoryTracking=detail -jar app.jar
# 打印详细分类
jcmd <pid> VM.native_memory detail
# 建立基线后查看增量
jcmd <pid> VM.native_memory baseline
# ... 运行一段时间 ...
jcmd <pid> VM.native_memory detail.diff输出分类:
Total: reserved=..., committed=...
- Java Heap (reserved=..., committed=...)
- Class (reserved=..., committed=...)
- Thread (reserved=..., committed=...)
- Code (reserved=..., committed=...)
- GC (reserved=..., committed=...)
- Internal (reserved=..., committed=...)
JFR 快速排障流程
# 1. 开始 60 秒录制
jcmd <pid> JFR.start duration=60s filename=/tmp/app.jfr
# 2. 用 Java Mission Control(jmc)打开分析
jmc /tmp/app.jfrJFR 录制几乎零开销(< 1% CPU),可在生产环境长期开启。