jcmd 是 JDK 自带的轻量级 JVM 诊断工具,支持线程堆栈(Thread.print)、原生内存分析(VM.native_memory summary/detail,需提前开启 NMT)、JFR 动态启停(JFR.start/stop)及 JVM 基础信息查询;执行 jcmd -l 可可靠列出当前用户所有 Java 进程 PID 和主类名,比 ps aux | grep java 更精准。

jcmd 是 JDK 自带的轻量级 JVM 诊断工具,无需额外依赖,适用于运行中的 Java 进程,支持线程堆栈、堆内存、VM 信息、JFR 控制等常见诊断操作。
查看当前 JVM 进程列表
执行 jcmd -l 可列出所有可被当前用户访问的 Java 进程,输出包含 PID 和主类名(或 jar 路径):
- 若进程无主类名(如某些容器化应用),可能显示为
sun.tools.jcmd.JCmd或空,此时可结合ps aux | grep java辅助确认 - 部分安全策略限制下,普通用户可能看不到其他用户的 Java 进程,需切换对应用户或使用 root(生产环境慎用)
获取基础 JVM 信息
对指定 PID 执行 jcmd <pid>(不带子命令),会打印该 JVM 的启动参数、系统属性、JVM 版本及已加载的模块摘要:
- 重点关注
-Xmx、-XX:+UseG1GC等关键 JVM 参数是否符合预期 - 输出中
VM.native_memory默认不启用,如需原生内存概览,需先开启-XX:NativeMemoryTracking=summary
触发线程快照与堆转储
常用诊断动作可通过子命令直接执行:
立即学习“Java免费学习笔记(深入)”;
-
jcmd <pid> Thread.print:输出当前所有线程的堆栈(含锁状态),等价于kill -3 <pid>,但更可控 -
jcmd <pid> VM.native_memory summary:查看原生内存使用概要(需提前开启 NMT) -
jcmd <pid> VM.native_memory detail:输出详细内存分配链路(慎用,可能影响性能) -
jcmd <pid> VM.native_memory baseline:记录当前内存基线,便于后续对比 -
jcmd <pid> VM.native_memory summary diff:对比上次 baseline 的变化 -
jcmd <pid> VM.native_memory shutdown:关闭 NMT(仅限未开启时调用无效)
管理 JFR(Java Flight Recorder)
JDK 8u262+ 及 JDK 9+ 内置 JFR,jcmd 可动态启停录制:
-
jcmd <pid> JFR.start name=rec1 duration=60s filename=/tmp/rec1.jfr:启动一次 60 秒录制 -
jcmd <pid> JFR.check:查看当前正在运行的录制任务 -
jcmd <pid> JFR.stop name=rec1:停止指定录制并保存文件 - 注意:JFR 默认未启用,首次使用前建议检查
jcmd <pid> VM.flags是否含-XX:+FlightRecorder,否则需重启 JVM 添加该参数


















