JCMD工具使用

JCMD

jcmd (Java Diagnostic Command) 是 JDK 自带的一个非常强大且多功能的命令行工具。它被设计用来替代 jmap、jstack、jinfo 等老旧的单一功能工具。内置于 JDK,无需额外安装;功能丰富,支持多种命令如线程、内存分析;性能开销低 使用需要熟悉命令行;对新手不够友好,图形化支持有限。虽然 jcmd 性能开销很小,但在生产环境执行 GC.heap_dump(尤其是大堆)或 GC.class_histogram 仍然会引起暂时的停顿

常见使用场景

列出当前运行的 Java 进程

> jcmd -l
10064 org.jetbrains.idea.maven.server.RemoteMavenServer36
21556 com.intellij.idea.Main
18584 jdk.jcmd/sun.tools.jcmd.JCmd -l

查看特定JVM进程支持的所有命令

并非所有 JVM 版本支持的命令都一样,使用 help 查看当前进程支持的操作。

# jcmd <PID> help
jcmd 12345 help

内存与 GC 分析 (替代 jmap)

这是 jcmd 最常用的场景之一,用于排查内存泄漏和 OOM 问题。

导出堆快照 (Heap Dump),这是分析内存泄漏的标准。

-all:可选参数,导出所有对象(包括不可达对象)。如果不加,只导出存活对象。

# jcmd <PID> GC.heap_dump <文件路径>
jcmd 12345 GC.heap_dump /tmp/dump.hprof

查看类数量

如果不想导出巨大的 Dump 文件,只想快速看哪个类的实例最多,占用内存最大,用这个。

# jcmd <PID> GC.class_histogram
jcmd 21556 GC.class_histogram

结果如下,这里只贴出最上面几行数据

image

强制执行 Full GC

jcmd 12345 GC.run
注意: 生产环境慎用,可能导致 STW (Stop-The-World)。

线程分析 (替代 jstack)

用于排查死锁、CPU 占用过高、线程阻塞问题。
输出所有线程的当前状态和堆栈信息。

# jcmd <PID> Thread.print
jcmd 12345 Thread.print

如果想要以 JSON 格式输出(便于工具解析):jcmd 12345 Thread.print -json (JDK 17+ 支持)

查看 VM 信息与配置 (替代 jinfo)

查看 JVM 启动参数 (Flags)
查看启动时设置的 -Xms, -Xmx, -XX:+UseG1GC 等参数。

> jcmd 21556 VM.flags
21556:
-XX:CICompilerCount=2 -XX:ConcGCThreads=4 -XX:ErrorFile=C:\Users\lenovo\java_error_in_idea_%p.log -XX:G1ConcRefinementThreads=15 -XX:G1EagerReclaimRemSetThreshold=16 -XX:G1HeapRegionSize=2097152 -XX:G1RemSetArrayOfCardsEntries=16 -XX:G1RemSetHowlMaxNumBuckets=8 -XX:G1RemSetHowlNumBuckets=8 -XX:GCDrainStackTargetSize=64 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\Users\lenovo\java_error_in_idea.hprof -XX:+IgnoreUnrecognizedVMOptions -XX:InitialHeapSize=134217728 -XX:JbrShrinkingGcMaxHeapFreeRatio=40 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=4253024256 -XX:MaxNewSize=2550136832 -XX:MinHeapDeltaBytes=2097152 -XX:MinHeapSize=134217728 -XX:NonNMethodCodeHeapSize=5826188 -XX:NonProfiledCodeHeapSize=265522362 -XX:-OmitStackTraceInFastThrow -XX:ProfiledCodeHeapSize=265522362 -XX:ReservedCodeCacheSize=536870912 -XX:+SegmentedCodeCache -XX:SoftMaxHeapSize=4253024256 -XX:TieredOldPercentage=100000 -XX:+UnlockDiagnosticVMOptions -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation

查看系统属性 (System Properties)

查看 -D 传入的参数以及操作系统环境信息(如 file.encoding, user.home)。
jcmd 12345 VM.system_properties

查看 JVM 运行时间

jcmd 12345 VM.uptime

动态修改 VM 参数

允许在不重启的情况下修改某些标记为 manageable 的 JVM 参数(例如开启/关闭 GC 日志,或者 HeapDumpOnOutOfMemoryError)。


# 格式: jcmd <PID> VM.set_flag <参数名> <值>
jcmd 12345 VM.set_flag HeapDumpOnOutOfMemoryError true

参考资料

https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html

https://github.com/openjdk/jdk/blob/master/src/jdk.jcmd/share/classes/sun/tools/jcmd/JCmd.java

posted @ 2026-01-29 23:57  vonlinee  阅读(2)  评论(0)    收藏  举报