jcmd 命令
jcmd 是一个非常有用的命令, 尤其在非桌面环境下. 之前介绍的 jps, jstack, jinfo 的很多功能, 都被整合进了这个最新的 jcmd 命令. 用户通过 jcmd 发送诊断命令给 JVM, JVM 输出相关的信息. 使用 jcmd 时, 要注意和目标 jvm 进程使用同一用户, 否则可能无法使用这个命令.
首先, 我们使用 -h 去查看一下帮助:
LM-SHC-16501315:Downloads xiatian$ jcmd -h
Usage: jcmd <pid | main class> <command ...|PerfCounter.print|-f file>
or: jcmd -l
or: jcmd -h
我们可以通过 jcmd -l 去列出所有的 Java 进程, 这就相当于 jps. 上面的 jcmd -h 就是输出这个帮助文档.
在使用相关命令或者 PerfCounter.print 命令的时候, 可以使用进程 ID 或者 main 类名去匹配. 如果传入的进程 ID 是0, 那么它就认为你要对系统所有 Java 进程执行这个/些命令.
-f 后面跟文件, 意思是让它执行文件里面的所有命令.
Perfcounter.print 是打印当前 Java 进程所拥有的所有 Performance counter 数据.
可以通过如下命令, 去查看当前 Java 进程能执行的 jcmd 命令:
LM-SHC-16501315:Downloads xiatian$ jcmd 42596 help
42596:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
GC.rotate_log
Thread.print
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
help
还可以进一步通过 help 去查看每个具体命令的帮助, 比如
jcmd $pid help GC.heap_dump
有些命令要求在 JVM 启动时候, 必须先解锁某些 feature 才能用, 比如 JFR 相关的, VM.native_memory等.
//列出 JVM flags
jcmd $pid help VM.flags
jcmd $pid help VM.flags -all // 列出所有
jcmd $pid GC.heap_dump heap.hprof
可能是最新的 JVM 版本 支持使用 -all 选项, 不做full GC, dump 所有对象. 类似于 jmap 不用 live 选项
jcmd $pid GC.heap_dump -all <filename>
//-all : [optional] Dump all objects, including unreachable objects (BOOLEAN, false)