什么是 jcmd

jcmd 是 JDK 7u4+ 引入的诊断命令行工具,通过 JVM 的 Diagnostic Command (DCMD) 接口与目标 JVM 通信。

为什么强大?

  • ✅ JDK 自带:无需额外安装
  • ✅ 低开销:多数操作对应用影响极小
  • ✅ 功能全面:覆盖 jpsjstackjmapjstatjinfo 大部分功能
  • ✅ 安全可靠:无需开启 JMX 或特殊 JVM 参数
  • ✅ 脚本友好:输出格式清晰,易于解析

 基础使用:查看目标 JVM

# 列出本机所有 Java 进程
jcmd# 输出示例:
# 12345 MyApp
# 67890 JConsole
# 查看某个 JVM 支持的所有命令
jcmd <pid> help# 示例:
jcmd 12345 help

场景一:诊断“CPU 飙升”——获取线程栈

# 获取所有线程栈(等价于 jstack)
jcmd 12345 Thread.print# 重定向到文件
jcmd 12345 Thread.print > thread_dump.txt

🔍 分析重点

  • RUNNABLE 状态的线程是否在执行密集计算?
  • 是否有线程在死循环或正则回溯?
  • 是否有 BLOCKED 线程导致锁竞争?

场景二:怀疑内存泄漏——生成堆转储

# 生成堆转储(等价于 jmap -dump)
jcmd 12345 GC.run_finalization
jcmd 12345 GC.run
jcmd 12345 VM.gc
jcmd 12345 GC.run_finalization
jcmd 12345 GC.run
jcmd 12345 VM.gc
jcmd 12345 GC.run_finalization
jcmd 12345 GC.run
jcmd 12345 VM.gc
jcmd 12345 GC.run_finalization
jcmd 12345 GC.run
jcmd 12345 VM.gc
jcmd 12345 GC.run_finalization
jcmd 12345 GC.run
jcmd 12345 VM.gc
jcmd 12345 GC.run_finalization
jcmd 12345 GC.run
jcmd 12345 VM.gc
jcmd 12345 GC.run_finalization
jcmd 12345 GC.run
jcmd 12345 VM.gc
jcmd 12345 GC.run_finalization
jcmd 12345 GC.run
jcmd 12345 VM.gc
jcmd 12345 GC.run_finalization
jcmd 12345 GC.run
jcmd 12345 VM.gc
jcmd 12345 GC.run_finalization
jcmd 12345 GC.run
jcmd 12345 VM.gc
jcmd 12345 GC.run_finalization
jcmd 12345 GC.run
jcmd 12345 VM.gc
jcmd 12345 GC.run_finalization
jcmd 12345 GC.run
jcmd 12345 VM.gc
jcmd 12345 GC.run_finalization
jcmd 12345 GC.run
jcmd 12345 VM.gc
jcmd 12345 GC.run_finalization
jcmd 12345 GC.run
jcmd 12345 VM.gc
jcmd 12345 GC.run_finalization
jcmd 12345 GC.run
jcmd 12345 VM.gc
jcmd 12345 GC.run_finalization
jcmd ......