jcmd 命令
在 jdk1.7 之后,新增了一个命令行工具jcmd,它是一个多功能工具,用它可以导出堆,查看java进程,导出线程信息,执行GC等。
jcmd能将命令发送给正在运行的JVM,诊断运行中的java应用。
jcmd程序须运行在与JVM相同机器上,需拥有与JVM相同的权限。
jcmd程序可在已运行的JVM中,动态地与Java飞行记录器(JFR)交互。
如果,应用程序已处于停止响应状态,则可使用jcmd命令进行数据收集工作,如:收集堆栈信息:
jcmd <pid> Thread.print。
jcmd 语法
jcmd [-l|-h|-help] jcmd pid|main-class PerfCounter.print jcmd pid|main-class -f filename jcmd pid|main-class command[ arguments]
1、帮助
➜ kc_script jcmd -h Usage: jcmd <pid | main class> <command ...|PerfCounter.print|-f file> or: jcmd -l or: jcmd -h command must be a valid jcmd command for the selected jvm. Use the command "help" to see which commands are available. If the pid is 0, commands will be sent to all Java processes. The main class argument will be used to match (either partially or fully) the class used to start Java. If no options are given, lists Java processes (same as -p). PerfCounter.print display the counters exposed by this process -f read and execute commands from the file -l list JVM processes on the local machine -h this help
说明
-f:从文件中读取并执行命令
-l:本地机器上列出jvm的进程
-h:帮助
2、列出虚拟机
命令: jcmd -l
列出本机所有的虚拟机。
[root@searching-search-service-7cbfd67967-lczgh /]# jcmd -l 19 org.apache.catalina.startup.Bootstrap start 3662 sun.tools.jcmd.JCmd -l
3、查看jcmd支持的命令
命令:jcmd <pid> help
列出pid对应虚拟机所支持的命令。
[root@searching-search-service-7cbfd67967-lczgh /]# jcmd 19 help 19: The following commands are available: JFR.stop # java飞行记录器 停止 JFR.start # java飞行记录器 开始 JFR.dump # java飞行记录器 dump JFR.check # java飞行记录器 检查 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堆dump GC.run_finalization # gc运行结束 GC.run # gc运行 VM.uptime # 虚拟机运行时间单位 秒 VM.flags # 虚拟机信息 VM.system_properties # 虚拟机系统配置 VM.command_line # 虚拟机命令行 VM.version # 虚拟机版本 help For more information about a specific command use 'help <command>'.
然后挑选出虚拟机支持的任意命令执行:jcmd pid xxx
;
如果需要对特定的命令进行帮助说明,可以在 help 之后加上命令名。
# 查询内容 [root@searching-search-service-7cbfd67967-lczgh /]# jcmd 19 VM.version 19: Java HotSpot(TM) 64-Bit Server VM version 25.161-b12 JDK 8.0_161 # 查询帮助 [root@searching-search-service-7cbfd67967-lczgh /]# jcmd 19 help VM.version 19: VM.version Print JVM version information. Impact: Low Permission: java.util.PropertyPermission(java.vm.version, read) Syntax: VM.version
帮助信息包含了命令的含义、影响、权限、语法等信息。
4、生成堆dump
命令:jcmd <PID> GC.heap_dump filepath
很多时候我们需要生成dump,再使用特定工具去详细进行分析(例如VisualVm)。
之前说过的 jmap 同样可以生成dump文件,Oracle 推荐使用 jcmd。
# 生成文件 [root@searching-search-service-7cbfd67967-lczgh /]# jcmd 19 GC.heap_dump gc.hprof 19: Heap dump file created # 查看文件大小 [root@searching-search-service-7cbfd67967-lczgh /]# ll -h -rw------- 1 root root 187M 1月 27 19:08 gc.hprof
5、生成类直方图
命令:jcmd <PID> GC.class_histogram
类直方图是一个较为直观的状态去查看内存分布的情况。
与jmap -histo <pid>效果相同,推荐使用jcmd工具。
另外jhat也可以分析出类直方图
# 导出到文件 [root@searching-search-service-7cbfd67967-lczgh /]# jcmd 19 GC.class_histogram > tmp.log # 查看文件 [root@searching-search-service-7cbfd67967-lczgh /]# more tmp.log 19: num #instances #bytes class name ---------------------------------------------- 1: 12844 94591240 [B 2: 145686 20808208 [C 3: 25526 8967192 [Ljava.lang.Object; 4: 142502 3420048 java.lang.String 5: 3276 2149056 io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueue 6: 16175 1795488 java.lang.Class 7: 52844 1691008 java.util.concurrent.ConcurrentHashMap$Node 8: 15177 1335576 java.lang.reflect.Method 9: 38339 1226848 java.util.HashMap$Node 10: 243 982864 [Ljava.nio.ByteBuffer; 11: 8322 829632 [I 12: 232 664304 [Ljava.nio.channels.SelectionKey; 13: 6106 657016 [Ljava.util.HashMap$Node; 14: 13629 654192 java.util.HashMap 15: 914 467192 [Ljava.util.concurrent.ConcurrentHashMap$Node; 16: 1229 462104 java.lang.Thread 17: 26228 419648 java.lang.Object
6、打印线程状态
有时候我们的应用程序会产生死锁或者频繁争抢资源的情况,那么就可以通过打印线程状态来详细分析各个线程的执行状态。
jstack <PID> jcmd <PID> Thread.print
故障排除
jcmd程序提供如下故障排除选项:
1、录制记录(Start a recording)
示例:在指定Java进程(19)上开始2分钟记录,并保存到当前目录的my-recording.jfr文件中。
[root@searching-search-service-7cbfd67967-lczgh /]# jcmd 19 JFR.start name=MyRecording settings=profile delay=20s duration=2m filename=tmp/my-recording.jfr 19: Java Flight Recorder not enabled. Use VM.unlock_commercial_features to enable.
如果没有开启会有提示,使用 VM.unlock_commercial_features 开启,在VM options 添加: -XX:+UnlockCommercialFeatures。
2、检查记录(Check a recording)
JFR.check检查正在运行的记录,如:
jcmd 19 JFR.check
3、停止记录(Stop a recording)
JFR.stop命令停止正在运行的记录,如:
jcmd 19 JFR.stop
4、转储记录(Dump a recording)
JFR.dump命令停止正在运行的录制,并将记录存储到record文件,如:
jcmd 19 JFR.dump name=MyRecording filename=tmp/my-recording.jfr
未经允许请勿转载:程序喵 » jvm 指令工具 jcmd 命令(Java多功能命令行)