JVM 全能工具:jcmd 入门教程

在 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 等多系统

二、前置条件

  1. 已安装 JDK 1.7+(jcmd 从 JDK 1.7 开始引入,JRE 不包含)

  2. 配置好 JDK 环境变量,确保在命令行可直接输入 jcmd 生效

  3. 拥有目标 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 互补)

  1. 应用卡顿、无响应:先执行 jcmd <PID> Thread.print → 查看线程堆栈,定位阻塞/死锁线程

  2. 内存异常、OOM 隐患:先执行 jcmd <PID> GC.heap_info 查看内存使用 → 再执行 VM.heap_dump 生成快照分析

  3. JVM 参数配置排查:执行 jcmd <PID> VM.command_line → 确认启动参数是否符合预期(如堆内存、元空间大小)

  4. 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 开发/运维必备工具。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容