jcmd

返回 JDK 工具

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.flags

Java 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.printjstack
堆对象统计GC.class_histogramjmap -histo
堆转储GC.heap_dumpjmap -dump
JVM 参数VM.flagsjinfo -flags
系统属性VM.system_propertiesjinfo -sysprops
触发 GCGC.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.jfr

JFR 录制几乎零开销(< 1% CPU),可在生产环境长期开启。


相关链接

  • jstack — 专用线程快照工具
  • jconsole — 图形化监控界面
  • JVM — 内存结构背景
  • JIT — 代码缓存与编译相关命令(Compiler.*