在 Java 运维和问题排查中,除了轻量的 jstat,还有一款全能型 JVM 命令行工具——jcmd。它整合了 jps、jstat、jmap、jstack 等多种工具的核心功能,无需切换多个命令,一个 jcmd 就能搞定 JVM 监控、内存分析、线程排查等大部分需求。
一、jcmd 是什么?
jcmd 是 JDK 1.7 及以上版本自带的命令行工具,集多种 JVM 工具功能于一体,用于向运行中的 Java 进程发送诊断命令,获取 JVM 运行时信息、执行内存 dump、查看线程堆栈、生成性能快照等。
核心优势:
功能全面:整合 jps、jstat、jmap、jstack 等工具能力,无需记忆多个命令
操作灵活:支持向指定进程发送多种诊断命令,按需获取数据
无侵入性:无需重启应用,直接与运行中的 Java 进程交互,性能开销低
兼容性强:适配主流 JDK 版本,支持 Windows、Linux、Mac 等多系统
二、前置条件
已安装
JDK 1.7+(jcmd 从 JDK 1.7 开始引入,JRE 不包含)配置好 JDK 环境变量,确保在命令行可直接输入 jcmd 生效
拥有目标 Java 进程的访问权限(与 jstat 权限要求一致)
三、核心命令(直接复制可用)
1. 先获取 Java 进程 PID(同 jstat,也可直接用 jcmd 查看)
# 方法1:用 jps 查看(和 jstat 一致)
jps -l
# 方法2:用 jcmd 查看(无需额外命令)
jcmd -l
输出示例(两种方法输出一致):
12345 com.example.Application
67890 org.apache.tomcat.startup.Bootstrap
记住目标进程 PID(如 12345),后续所有 jcmd 命令都需指定 PID。
2. 查看 jcmd 支持的所有命令(关键!)
jcmd 支持多种诊断命令,先查看当前进程支持的所有命令,按需选择:
# 格式:jcmd <PID> help
jcmd 12345 help
输出会列出所有支持的命令(如 VM.heap_dump、Thread.print、GC.run 等),日常重点关注以下 5 个高频命令。
3. 高频核心命令(日常必用)
(1)查看 JVM 基础信息(替代 jstat 部分功能)
# 查看 JVM 运行时参数、内存配置、线程信息等
jcmd 12345 VM.command_line
jcmd 12345 VM.system_properties
用途:快速查看 JVM 启动参数(如堆内存大小 -Xms/-Xmx)、系统属性,排查参数配置问题。
(2)查看线程堆栈(替代 jstack,排查死锁、线程阻塞)
# 输出所有线程堆栈信息,可直接排查死锁、线程阻塞
jcmd 12345 Thread.print
关键用途:当应用卡顿、响应慢时,执行该命令,查看是否有线程处于 BLOCKED 状态,快速定位死锁或阻塞原因。
(3)执行 GC(手动触发垃圾回收,测试用)
# 手动触发 Young GC
jcmd 12345 GC.run
# 手动触发 Full GC(谨慎使用,线上尽量避免)
jcmd 12345 GC.run_finalization
注意:线上环境尽量不要随意手动触发 Full GC,可能会导致应用短暂卡顿,仅用于测试或紧急排查。
(4)生成堆内存快照(替代 jmap,排查内存泄漏)
# 格式:jcmd <PID> VM.heap_dump <快照保存路径>
jcmd 12345 VM.heap_dump D:/heapdump.hprof
用途:生成堆内存快照文件(.hprof 格式),后续可用 JVisualVM 等工具分析,排查内存泄漏、大对象占用等问题。
(5)查看 GC 统计信息(类似 jstat -gcutil)
# 查看 GC 详细统计,包括 GC 次数、耗时、内存使用等
jcmd 12345 GC.heap_info
jcmd 12345 GC.gcstats
优势:输出比 jstat 更详细的 GC 信息,无需频繁刷新,一次命令即可获取完整 GC 统计。
4. 其他实用命令(按需使用)
# 查看类加载信息(替代 jstat -class)
jcmd 12345 VM.class_hierarchy
# 生成 JVM 性能快照(包含内存、线程、GC 等所有信息)
jcmd 12345 VM.snapshot
四、实战排查思路(和 jstat 互补)
应用卡顿、无响应:先执行
jcmd <PID> Thread.print→ 查看线程堆栈,定位阻塞/死锁线程内存异常、OOM 隐患:先执行
jcmd <PID> GC.heap_info查看内存使用 → 再执行VM.heap_dump生成快照分析JVM 参数配置排查:执行
jcmd <PID> VM.command_line→ 确认启动参数是否符合预期(如堆内存、元空间大小)GC 异常排查:结合 jstat 实时监控 + jcmd GC.gcstats 详细统计,定位 GC 频繁、耗时过长问题
五、jcmd 与 jstat 对比(怎么选?)
jstat:专注 GC 实时监控,轻量、适合长期刷新查看,重点看 GC 频率和内存变化
jcmd:功能全面,侧重 诊断和分析,可生成快照、查看线程、手动触发 GC,适合问题排查
日常搭配使用:用 jstat 实时监控 GC 状态,发现异常后,用 jcmd 执行进一步诊断(如线程堆栈、内存快照)。
六、总结
jcmd 是 Java 问题排查的全能工具,整合了多种 JVM 工具的核心能力,无需切换多个命令,大大提升排查效率。
日常最推荐 3 条高频命令(记牢够用):
# 1. 查看线程堆栈(排查卡顿、死锁)
jcmd <PID> Thread.print
# 2. 生成堆内存快照(排查内存泄漏)
jcmd <PID> VM.heap_dump <保存路径>
# 3. 查看 GC 统计信息(补充 jstat)
jcmd <PID> GC.heap_info
核心要点:jcmd 无侵入、功能全,与 jstat 互补使用,能覆盖大部分 Java 应用运维和问题排查场景,是 Java 开发/运维必备工具。