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></pid>(不带子命令),会打印该 JVM 的启动参数、系统属性、JVM 版本及已加载的模块摘要:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 重点关注
-Xmx、-XX:+UseG1GC等关键 JVM 参数是否符合预期 - 输出中
VM.native_memory默认不启用,如需原生内存概览,需先开启-XX:NativeMemoryTracking=summary
触发线程快照与堆转储
常用诊断动作可通过子命令直接执行:
-
jcmd <pid> Thread.print</pid>:输出当前所有线程的堆栈(含锁状态),等价于kill -3 <pid></pid>,但更可控 -
jcmd <pid> VM.native_memory summary</pid>:查看原生内存使用概要(需提前开启 NMT) -
jcmd <pid> VM.native_memory detail</pid>:输出详细内存分配链路(慎用,可能影响性能) -
jcmd <pid> VM.native_memory baseline</pid>:记录当前内存基线,便于后续对比 -
jcmd <pid> VM.native_memory summary diff</pid>:对比上次 baseline 的变化 -
jcmd <pid> VM.native_memory shutdown</pid>:关闭 NMT(仅限未开启时调用无效)
管理 JFR(Java Flight Recorder)
JDK 8u262+ 及 JDK 9+ 内置 JFR,jcmd 可动态启停录制:
-
jcmd <pid> JFR.start name=rec1 duration=60s filename=/tmp/rec1.jfr</pid>:启动一次 60 秒录制 -
jcmd <pid> JFR.check</pid>:查看当前正在运行的录制任务 -
jcmd <pid> JFR.stop name=rec1</pid>:停止指定录制并保存文件 - 注意:JFR 默认未启用,首次使用前建议检查
jcmd <pid> VM.flags</pid>是否含-XX:+FlightRecorder,否则需重启 JVM 添加该参数
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










