jvm 指令工具 jcmd 命令(Java多功能命令行)

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多功能命令行)

点  赞 (2) 打  赏
分享到: