admin管理员组

文章数量:1609966

jcmd 命令

在 jdk1.7 之后,新增了一个命令行工具jcmd,它是一个多功能工具,用它可以导出堆,查看java进程,导出线程信息,执行GC等。jcmd能将命令发送给正在运行的JVM,诊断运行中的java应用。

jcmd程序须运行在与JVM相同机器上,需拥有与JVM相同的权限。

jcmd程序可在已运行的JVM中,动态地与Java飞行记录器(JFR)交互。

如果,应用程序已处于停止响应状态,则可使用jcmd命令进行数据收集工作,如:收集堆栈信息:jcmd  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  

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 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            # 虚拟机系统配置

VMmand_line                 # 虚拟机命令行

VM.version                      # 虚拟机版本

help

For more information about a specific command use 'help '.

然后挑选出虚拟机支持的任意命令执行: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 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 GC.class_histogram

类直方图是一个较为直观的状态去查看内存分布的情况。

与jmap -histo 效果相同,推荐使用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  ioty.util.internal.shaded.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 

jcmd  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

本文标签: 指令工具多功能命令行命令