java诊断工具之jcmd

  |   0 评论   |   21 浏览

简介

jcmd被用于发送诊断命令给JVM,这些请求对控制java飞行记录、排查故障和、诊断JVM和java应用。JVM必须运行在相同的机器上,并具有启动JVM相同的有效用户和组标识符。

jcmd比较有用的命令

在不同的HotSpot VM版本中jcmd命令有所不同,因此可以使用jcmd <process id/main class> help命令来查看所有可用选项,以下命令是在JDK8中最有用的命令,可以使用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

创建一个堆dump文件

jmap -dump:file=<file> <pid>生成堆dump文件相同,但是建议使用jcmd命令,这里生成hprof文件。

jcmd GC.heap_dump filename=Myheapdump

创建堆直方图

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

jmap -histo <pid>命令相似,但是推荐使用jcmd命令。

打印所有带有堆栈跟踪的线程

jcmd <process id/main class> Thread.print

使用jcmd进行故障排除

jcmd提供以下排查故障的命令

开始记录

比如:对进程7060开始一个2分钟的记录,文件名字叫myrecording.jfr

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

检查记录

JFR.check命令检查正在运行的记录

jcmd 7060 JFR.check

停止记录

JFR.stop诊断命令停止正在运行的记录,并具有丢弃记录数据的选项

jcmd 7060 JFR.stop

dump一个记录

诊断命令停止正在运行的记录,并具有将录音dump到文件中的选项

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

创建堆dump

创建堆dump的首选方法是

jcmd <pid> GC.heap_dump filename=Myheapdump

创建堆直方图

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

jcmd <pid> GC.class_histogram filename=Myheaphistogram

基本命令

jcmd [-l|-h|-help]

jcmd pid|main-class PerfCounter.print

jcmd pid|main-class -f filename

jcmd pid|main-class command[ arguments]

使用jcmd命令时没有参数或者-l,那么将输出所有java应用的pid和主类。
image.png
如果指定pid或者主类,那么jcmd将发送诊断命令请求到改应用,如果pid为0,表示发送命令到所有可用的java应用,使用下面其中一个作为诊断请求:
Perfcounter.print
打印指定Java进程可用的性能计数器,性能计数器的列表可能因Java进程而异。

-f filename
要从中读取诊断命令并将其发送到指定Java进程的文件的名称。

command [arguments]
要发送到指定Java进程的命令,可以通过向该进程发送help命令来获得给定进程的可用诊断命令列表。

选项

-h或-help:打印帮助信息
-l:打印带有主类和命令行参数的运行Java进程标识符的列表。
-f filename:从指定文件中读取命令。只有在将流程标识符或主类指定为第一个参数时,才能使用此选项。文件中的每个命令必须写在一行上。以数字符号(#)开头的行将被忽略。当读取所有行或包含stop关键字的行时,文件处理结束。
如图可以使用以下命令
image.png

示例

jcmd <process id/main class> PerfCounter.print
在进程中打印所有性能计算器

image.png

jcmd <process id/main class> <command> [options]
将实际命令发送给JVM。

以下是使用jcmd实用工具向JVM显示诊断命令请求。

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

也可以关注我的公众号:程序之声
图片
关注公众号,领取更多资源

本文为博主原创文章,未经博主允许不得转载。

评论

发表评论