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











