技术记录栈

记录点滴:java、datebase、linux、spring、javascript、nginx

2018/11/03

jcmd命令的用法

jcmd可以将诊断命令发送给正在运行的Java虚拟机(JVM),用于控制Java飞行记录、故障诊断、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进行故障排除

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命令,可以获得指定进程的可用诊断命令列表,每个诊断命令都有自己的一组参数,要查看命令的描述、语法和可用参数列表。如下:将实际命令发送到JVM。

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>这些命令获取可用的选项。

打印完整的HotSpot和JDK版本ID

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):
...