jcmd命令用法

jcmd将命令发送给正在运行的JVM,控制JVM飞行记录、对Java应用进行诊断。

jcmd程序须运行在与JVM相同的机器上,需要拥有与JVM相同的权限。jcmd程序可以在已运行的JVM中,动态地与Java飞行记录器(JFR)进行交互。如果,应用程序已处于停止响应的状态,则可以使用jcmd命令进行数据收集工作,如:收集堆栈信息:

jcmd <pid> Thread.print。

要从远程计算机,或使用不同的权限调用诊断命令,可以使用以下接口:

com.sun.management.DiagnosticCommandMBean

有关DiagnosticCommandMBean接口的更多信息,参阅API文档

jcmd语法

jcmd [-l|-h|-help]

jcmd pid|main-class PerfCounter.print

jcmd pid|main-class -f filename

jcmd pid|main-class command[ arguments]

故障排除

jcmd程序提供以下故障排除选项:

录制记录(Start a recording)

示例:在指定的Java进程(7060)上开始2分钟的记录,并将其保存到当前目录中的myrecording.jfr文件中。

jcmd 7060 JFR.start name=MyRecording settings=profile delay=20s duration=2m filename=C:\TEMP\myrecording.jfr

检查记录(Check a recording)

JFR.check检查正在运行的记录。例如:

jcmd 7060 JFR.check

停止记录(Stop a recording)

JFR.stop命令停止正在运行的记录。例如:

jcmd 7060 JFR.stop

转储记录(Dump a recording)

JFR.dump命令停止正在运行的录制,并将记录存储到record文件。例如:

jcmd 7060 JFR.dump name=MyRecording filename=C:\TEMP\myrecording.jfr

创建堆转储(Create a heap dump)

创建堆转储的首选方法:

jcmd <pid> GC.heap_dump filename=Myheapdump

创建堆直方图(Create a heap histogram)

创建堆直方图的首选方法:

jcmd <pid> GC.class_histogram filename=Myheaphistogram

jcmd参数说明

jcmd不带参数,或使用该-l选项运行,将打印正在运行的Java进程标识符列表,其中,包含用于启动进程的main-class和命令行参数。使用-h或-help选项打印帮助消息。

如果,将进程标识符(pid)或主类(main-class)作为第一个参数,jcmd会将诊断命令发送到指定的Java进程,或发送到具有指定启动类的所有Java进程。也可以把0作为进程标识符,将诊断命令发送给所有的Java进程。使用下面其中一项作为诊断命令:

Perfcounter.print

打印指定Java进程中,可用的性能计数器,性能计数器的列表会因Java进程不同有所不同。

jcmd <process id/main class> PerfCounter.print

-f 文件名

从指定文件中读取命令,然后,在目标Java进程上执行这些命令,file中每条命令独占一行,以"#"开头的行会被忽略,所有命令调用完后,或者读取到含有stop的关键字,会终止对file的处理。

command [ 参数 ]

发送到指定Java进程的命令,通过向该进程发送help命令,获得指定进程可用的诊断命令列表,每个诊断命令都有自己的一组参数,要查看命令的描述、语法和可用参数列表,使用如下命令:

jcmd <process id/main class> <command> [options]

注:如果参数包含空格,则须用单引号或双引号括起来('或")。此外,须用反斜杠(\)转义单引号或双引号,以防止操作系统shell处理引号。或者,使用单引号括起参数,再使用双引号(或使用双引号,然后使用单引号)。

互斥选项

-f 文件名

从指定文件中读取命令,仅在将进程标识符,或主类作为第一个参数时,才能使用此选项。

-h|-help 打印帮助信息。

-l

使用主类和命令行参数,打印正在运行的Java进程标识符列表;也可以使用jps命令。

jcmd通用命令

在不同版本的HotSpot VM中,可用的诊断命令有所不同,因此,使用jcmd <process id/main class> help,查看当前版本支持的可用选项。以下是自JDK 8以来,该工具中一些最有用的命令。

注:始终通过jcmd <process id/main class> help <command>命令获取可用的选项。

打印JDK版本信息

jcmd <process id/main class> VM.version

打印VM系统参数

可以显示数百行信息。

jcmd <process id/main class> VM.system_properties

打印VM所有标志参数

即使,没有提供标志,也会打印一些默认值,如:初始/最大堆大小。

jcmd <process id/main class> VM.flags

以秒为单位打印运行时间

jcmd <process id/main class> VM.uptime

创建类直方图

结果可能相当冗长,可将输出重定向到文件。内部和特定应用程序类,都包含在列表中,占用最多内存的类,排在最顶端,按降序对类进行排列。

jcmd <process id/main class> GC.class_histogram

创建堆转储(hprof dump)

jcmd GC.heap_dump filename=Myheapdump

与jmap -dump:file=<file> <pid>效果相同, 推荐使用jcmd工具。

创建堆直方图

jcmd <process id/main class> GC.class_histogram filename=Myheaphistogram

与jmap -histo <pid>效果相同,推荐使用jcmd工具。

打印所有线程的堆栈跟踪

jcmd <process id/main class> Thread.print

jcmd命令演示

jcmd
5485 sun.tools.jcmd.JCmd
2125 MyProgram
 
> jcmd MyProgram help (or "jcmd 2125 help")
2125:
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
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
 
> jcmd MyProgram help Thread.print
2125:
Thread.print
Print all threads with stacktraces.
 
Impact: Medium: Depends on the number of threads.
 
Permission: java.lang.management.ManagementPermission(monitor)
 
Syntax : Thread.print [options]
 
Options: (options must be specified using the <key> or <key>=<value> syntax)
        -l : [optional] print java.util.concurrent locks (BOOLEAN, false)
 
> jcmd MyProgram Thread.print
2125:
2014-07-04 15:58:56
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.0-b69 mixed mode):
...