欢迎您, 来到 宁时修博客.^_^

Java程序线上排查命令----06、jcmd

2019/06/21 言则行 Java,linux命令 617
Java程序的问题排查命令

一、jcmd的简介

    在JDK1.7以后,新增了一个命令行工具 jcmd。jcmd一个用来发送诊断命令请求到JVM的工具,可以用它来导出堆、查看Java进程、导出线程信息、执行GC、故障排除、还可以进行采样分析(jmc 工具的飞行记录器)。jcmd必须与正在运行的JVM在同一台机器上使用,并且使用启动该JVM时的用户权限。



二、jcmd的使用参数

    jcmd用法:

jcmd [-l|-h|-help]

jcmd pid|main-class PerfCounter.print

jcmd pid|main-class -f filename

jcmd pid|main-class command[ arguments]


    参数解释:

    -l : 不带参数或参数-l,jcmd 将打印本机上所有运行中的Java进程信息。

    pid : 指定JAVA进程的pid,jcmd 将向该Java进程发送诊断命令请求。

    main class :  指定JAVA进程的main类,jcmd 将向包含该main类的子字符串的所有Java进程发送诊断命令请求。

    Perfcounter.print : 打印目标Java进程上可用的性能计数器。性能计数器的列表可能会随着Java进程的不同而产生变化。

    -f filename :从文件中读取命令,然后在目标Java进程上调用这些命令。在file中,每个命令必须写在单独的一行。以"#"开头的行会被忽略。当所有行的命令被调用完毕后,或者读取到含有stop关键字的命令,将会终止对file的处理。


    command:

[root@test-web-server ~]# jcmd 31941 help
31941:
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
GC.rotate_log
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

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



三、jcmd使用示例

    1、查看java进程信息

    命令: jcmd -l

    查看当前机器上的所有java进程信息

    

[root@test-web-server ~]# jcmd
[root@test-web-server ~]# jcmd -l
[root@test-web-server ~]# jps -l

    这三个命令效果是一样的


    2、查看性能统计

    命令:jcmd pid PerfCounter.print

    查看指定进程的性能统计信息。

[root@test-web-server ~]# jcmd 31941 PerfCounter.print
31941:
java.ci.totalTime=121215068195
java.cls.loadedClasses=20399
java.cls.sharedLoadedClasses=0
java.cls.sharedUnloadedClasses=0
java.cls.unloadedClasses=229
.................................

    

    3、列出当前运行的 java 进程可以执行的操作

[root@test-web-server ~]# jcmd 31941 help
31941:
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
GC.rotate_log
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

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


    注: JFR:Java飞行记录器(Java Flight Recorder),JRF 功能跟 jmc 工具的飞行记录器的功能一样的。

命令说明
JFR.stop停止JFR,执行命令:jcmd $PID JFR.stop name=abc,duration=120s
JFR.start启动JFR,执行命令:jcmd $PID JFR.start name=abc,duration=120s
JFR.dumpDump JFR,等待至少duration(设定120s)后,执行命令:jcmd PID JFR.dump name=abc,duration=120s filename=abc.jfr(注意,文件名必须为.jfr后缀)
JFR.check检查JFR状态,执行命令:jcmd $PID JFR.check name=abc,duration=120s
VM.native_memoryjava 8给HotSpot VM引入了Native Memory Tracking (NMT)特性,可以用于追踪JVM的内部内存使用。

借助-XX:NativeMemoryTracking=off|summary|detail这个选项,JVM支持我们一窥它是如何分配原生内存的。原生内存跟踪(Native Memory Tracking,NMT)默认是关闭的(off)。如果开启了概要模式(summary)或详情模式(detail),可以随时通过jcmd命令获得原生内存的信息:jcmd pid VM.native_memory summary。

如果JVM是使用-XX:+PrintNMTStatistics参数(默认false)启动的,它会在程序退出时打印原生内存分配信息。

VM.check_commercial_features检查商业功能是否锁定。
VM.unlock_commercial_featuresJFR需要JDK的商业证书,该参数解锁jdk的商业功能 。在 JDK 8u40 之前,JVM 必须带启动标记: -XX:+UnlockCommercialFeatures -XX:FlightRecorder,从 JDK 8u40 开始,JFR 可以在运行时启用。
ManagementAgent.stop停止JMX Agent
ManagementAgent.start_local开启本地JMX Agent
ManagementAgent.start开启JMX Agent
GC.rotate_log强制切割java进程的GC日志文件
Thread.print打印java线程堆栈信息, 参数 -l 打印 java.util.concurrent锁信息。相当于 jstack pid。
GC.class_stats

提供有关Java类元数据的统计信息。需要-XX:+UnlockDiagnosticvmOptions。

GC.class_histogram提供有关Java堆 类的统计信息。相当于 jmap -histo pid,可以查看每个类的实例数量和占用空间大小。
GC.heap_dump生成JVM的 Heap dump(HPROF格式)文件。相当于  jmap -dump:format=b,file=heapdump.phrof pid,导出的 dump 文件,可以使用MAT 或者 Visual VM 等工具进行分析。
GC.run_finalization对 JVM 执行 java.lang.System.runFinalization()。执行一次finalization操作,相当于:System.runFinalization()。
GC.run对 JVM 执行 java.lang.System.gc(),告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的。相当于:System.gc()。
VM.uptime查看 JVM 的启动时长(s)。
VM.flags

查看 JVM 的启动参数及其当前值。参数-all输出全部,相当于: jinfo -flags pid, jinfo -flag <VM FLAG> pid。

VM.system_properties查看 JVM 的系统配置信息。相当于: jinfo -sysprops pid。
VM.command_line打印用于启动此VM实例的命令行。相当于:jinfo pid | grep Command
VM.version查看目标jvm进程的版本信息


    查看每个操作的帮助信息:

jcmd pid help command

    如:

jcmd 31941 help VM.version


点赞
说说你的看法

所有评论: (0)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群