jcmd 是 JDK 7u40+ 自带的轻量级 JVM 诊断工具,支持进程列表查看(jcmd -l)、基础信息查询(VM.info)、线程快照(Thread.print)、原生内存分析(VM.native_memory)、JFR 控制及运行时参数查看(VM.flags)等,无需重启、低侵入、响应快。

jcmd 是 JVM 自带的轻量级诊断工具,无需额外依赖,适用于生产环境快速排查问题。它不依赖 JMX 或调试端口,直接通过本地 Unix 域套接字(Linux/macOS)或命名管道(Windows)与目标 JVM 进程通信,安全、低侵入、响应快。
查看 JVM 进程与基础信息
执行 jcmd -l 列出所有可访问的 Java 进程(含 PID 和主类名),支持过滤:
- 若只关心 Spring Boot 应用,可用
jcmd | grep "SpringApplication"快速定位 - 对特定 PID 执行
jcmd <pid> VM.info,获取 JVM 版本、启动参数、系统属性、运行时参数等关键元数据 -
jcmd <pid> VM.native_memory summary可快速查看堆外内存使用概览(需开启-XX:NativeMemoryTracking=summary)
触发即时诊断操作
无需预先配置,一条命令即可完成常见诊断任务:
- 生成堆转储:
jcmd <pid> VM.native_memory detail(配合 NMT)或jcmd <pid> VM.native_memory baseline;更常用的是jcmd <pid> VM.native_memory summary配合jmap -dump:format=b,file=heap.hprof <pid>,但 jcmd 本身不替代 jmap,而是提供统一入口 - 导出线程快照:
jcmd <pid> Thread.print输出当前所有线程状态(含锁信息、CPU 时间、栈帧),比jstack更稳定(尤其在高负载下) - 强制执行 GC:
jcmd <pid> VM.gc触发一次 Full GC(慎用,仅限紧急排查内存泄漏验证)
动态修改运行时行为
部分 JVM 参数支持运行时调整,jcmd 提供标准化接口:
立即学习“Java免费学习笔记(深入)”;
- 开启/关闭 GC 日志:
jcmd <pid> VM.native_memory summary不直接控制日志,但可通过jcmd <pid> VM.flags -all查看是否启用-Xlog:gc*;真正动态开关需用jcmd <pid> VM.set_flag PrintGCDetails true(仅限 manageable 标志) - 列出所有可调参数:
jcmd <pid> VM.flags -all | grep manageable - 修改阈值类参数(如
MaxMetaspaceSize)需重启,但像UseG1GC这类不可变标志无法运行时切换
执行自定义诊断指令(JDK 9+)
JDK 9 起引入了 DiagnosticCommand 扩展机制,第三方 agent 或 JDK 内置功能可通过 jcmd 注册新命令:
- Spring Boot Actuator 的
jcmd <pid> VM.system_properties实际复用 JVM 原生命令,但可配合VM.native_memory做组合分析 - 某些监控 agent(如 Arthas)会注册
arthas子命令,例如jcmd <pid> arthas start启动增强诊断会话 - 查看所有可用命令:
jcmd <pid> help,输出带简要说明的完整指令列表
不复杂但容易忽略:jcmd 默认只对同用户进程生效,跨用户需 root 权限;Windows 上需确保目标 JVM 启动时未禁用本地连接(默认开启)。日常建议将常用命令封装为 shell 别名,比如 alias jthread='jcmd \$1 Thread.print'。


















