jcmd命令用法

jcmd能将命令发送给正在运行的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不带参数或使用该-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命令。

通用命令

不同版本的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
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):
...