什么是 jcmd
?
jcmd
是 JDK 7u4+ 引入的诊断命令行工具,通过 JVM 的 Diagnostic Command (DCMD) 接口与目标 JVM 通信。
为什么强大?
- ✅ JDK 自带:无需额外安装
- ✅ 低开销:多数操作对应用影响极小
- ✅ 功能全面:覆盖
jps
、jstack
、jmap
、jstat
、jinfo
大部分功能 - ✅ 安全可靠:无需开启 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 ......