8.7 JVM命令行监控之——jcmd

1. 描述

jcmd即jvm command,该命令行工具的功能几乎涵盖了前面几节介绍的所有命令行工具的功能,它可以用来导出堆、查看堆栈使用情况、查看java进程、导出线程信息、查看GC运行情况。

2. 用法

命令:
jcmd pid help 查询jcmd有哪些command命令
jcmd pid commd
jcmd -l 查询java进程

2.1 查看java进程

命令:jcmd -l
相当于jps命令

E:\study\tool\javaSE1.8\jdk1.8\bin>jcmd -l
1876
10120 sun.tools.jcmd.JCmd -l
4168 org.jetbrains.jps.cmdline.Launcher D:/software/source/ideaIC-2021.1.win/lib/jps-model.jar;D:/software/source/ideaIC-2021.1.win/plugins/java/lib/maven-resolver-connector-basic-1.3.3.jar;D:/software/source/ideaIC-2021.1.win/lib/zip-signer.jar;D:/software/source/ideaIC-2021.1.win/lib/jna.jar;D:/software/source/ideaIC-2021.1.win/lib/intellij-deps-fastutil-8.5.2-6.jar;D:/software/source/ideaIC-2021.1.win/lib/netty-buffer.jar;D:/software/source/ideaIC-2021.1.win/plugins/java/lib/jps-builders-6.jar;D:/software/source/ideaIC-2021.1.win/lib/forms_rt.jar;D:/software/source/ideaIC-2021.1.win/lib/slf4j.jar;D:/software/source/ideaIC-2021.1.win/lib/qdox-2.0.0.jar;D:/software/source/ideaIC-2021.1.win/lib/gson-2.8.6.jar;D:/software/source/ideaIC-2021.1.win/plugins/java/lib/maven-resolver-transport-file-1.3.3.jar;D:/software/source/ideaIC-2021.1.win/lib/asm-all-9.1.jar;D:/software/source/ideaIC-2021.1.win/lib/annotations.jar;D:/software/source/ideaIC-2021.1.win/plugins/java/lib/jps-builders.jar;D:/software/source/ideaIC-2021.
10172 com.lzj.jps.JinfoDemo

2.2 查看jcmd有哪些command命令

命令:jcmd pid help

E:\study\tool\javaSE1.8\jdk1.8\bin>jcmd 10172 help
10172:
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>'.

2.3 查看虚拟机启动了多长时间

命令:jcmd pid VM.uptime
jstat也有查看时间的功能。

E:\study\tool\javaSE1.8\jdk1.8\bin>jcmd 10172 VM.uptime
10172:
1009.464 s

2.4 打印栈信息

命令:jcmd pid Thread.print
相当于jstack功能

E:\study\tool\javaSE1.8\jdk1.8\bin>jcmd 10172 Thread.print
10172:
2021-11-12 00:55:19
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.31-b07 mixed mode):

"Service Thread" #10 daemon prio=9 os_prio=0 tid=0x000000001b367000 nid=0x2dc0 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x000000001b30e800 nid=0x20ec waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x000000001b30d800 nid=0x147c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x000000001b2be800 nid=0xb60 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x000000001b2ad800 nid=0x1910 runnable [0x000000001b8de000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:150)
        at java.net.SocketInputStream.read(SocketInputStream.java:121)
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
        - locked <0x0000000780e28370> (a java.io.InputStreamReader)
        at java.io.InputStreamReader.read(InputStreamReader.java:184)
        at java.io.BufferedReader.fill(BufferedReader.java:161)
        at java.io.BufferedReader.readLine(BufferedReader.java:324)
        - locked <0x0000000780e28370> (a java.io.InputStreamReader)
        at java.io.BufferedReader.readLine(BufferedReader.java:389)
        at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:48)

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x0000000019ebf800 nid=0x15b4 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x000000001b223800 nid=0x20c4 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x0000000019e5a000 nid=0x13c8 in Object.wait() [0x000000001b1df000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x0000000780b062f8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:142)
        - locked <0x0000000780b062f8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:158)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x0000000019e56800 nid=0x27ec in Object.wait() [0x000000001b0df000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x0000000780b05d68> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157)
        - locked <0x0000000780b05d68> (a java.lang.ref.Reference$Lock)

"main" #1 prio=5 os_prio=0 tid=0x0000000002ce2800 nid=0x2a54 waiting on condition [0x000000000102f000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at com.lzj.jps.JinfoDemo.main(JinfoDemo.java:5)

"VM Thread" os_prio=2 tid=0x0000000002ddd800 nid=0x1448 runnable

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000002cf8800 nid=0x78c runnable

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000002cfa000 nid=0x478 runnable

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x0000000002cfb800 nid=0x1c44 runnable

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x0000000002cfe000 nid=0x10b4 runnable

"VM Periodic Task Thread" os_prio=2 tid=0x000000001b368000 nid=0x22bc waiting on condition

JNI global references: 17

2.5 查看类的统计信息

命令:jcmd pid GC.class_histogram可以查看堆中类的实例个数

 num     #instances         #bytes  class name
----------------------------------------------
   1:          4598         482368  [C
   2:           421         129672  [B
   3:          4229         101496  java.lang.String
   4:           687          72888  java.lang.Class
   5:           641          41960  [Ljava.lang.Object;
   6:           785          31400  java.util.TreeMap$Entry
   7:           236          11784  [Ljava.lang.String;
   8:           136          11576  [I
   9:           332          10624  java.util.HashMap$Node
  10:           107           6848  java.net.URL
  11:           108           4320  java.lang.ref.SoftReference
  12:            20           4160  [Ljava.util.HashMap$Node;
  13:           256           4096  java.lang.Integer
  14:           118           3776  java.util.Hashtable$Entry
  15:           110           3520  java.util.concurrent.ConcurrentHashMap$Node
  16:           104           3512  [[C
  17:             7           2632  java.lang.Thread
  18:            52           2496  sun.misc.URLClassPath$JarLoader
  19:            29           2320  [Ljava.util.WeakHashMap$Entry;
  20:            58           2320  java.util.LinkedHashMap$Entry
  21:            26           2080  java.lang.reflect.Constructor
  22:            15           1968  [Ljava.util.concurrent.ConcurrentHashMap$Node;
  23:            39           1872  sun.util.locale.LocaleObjectCache$CacheEntry
  24:            45           1800  java.lang.ref.Finalizer
  25:            26           1664  java.util.jar.JarFile
  26:            17           1632  java.util.jar.JarFile$JarFileEntry
  27:            28           1568  sun.nio.cs.UTF_8$Encoder
  28:             1           1560  [[B
  29:            58           1392  java.io.ExpiringCache$Entry
  30:            29           1392  java.util.WeakHashMap
  31:            84           1344  java.lang.Object
  32:            28           1344  java.util.HashMap
  33:            20           1280  java.util.concurrent.ConcurrentHashMap
  34:            30           1200  java.io.ObjectStreamField
  35:             9           1184  [Ljava.util.Hashtable$Entry;
  36:            36           1152  java.lang.ref.ReferenceQueue
  37:             1           1040  [Ljava.lang.Integer;
  38:            26            832  java.util.zip.ZipCoder
  39:            19            760  sun.util.locale.BaseLocale$Key
.............省略
 248:             1             16  sun.util.resources.LocaleData
 249:             1             16  sun.util.resources.LocaleData$LocaleDataResourceBundleControl
Total         14215         982024

2.6 导出堆dump文件

命令:jcmd pid GC.heap_dump file 把dump文件导入到file文件中

E:\study\tool\javaSE1.8\jdk1.8\bin>jcmd 10172 GC.heap_dump d:\1.hprof
10172:
Heap dump file created

2.7 获取系统的properties属性

命令:jcmd pid VM.system_properties

E:\study\tool\javaSE1.8\jdk1.8\bin>jcmd 10172 VM.system_properties
10172:
#Sat Nov 13 00:28:17 CST 2021
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=E\:\\study\\tool\\javaSE1.8\\jdk1.8\\jre\\bin
java.vm.version=25.31-b07
java.vm.vendor=Oracle Corporation
java.vendor.url=http\://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io
user.script=
user.country=CN
sun.java.launcher=SUN_STANDARD
......省略

2.8 获取JVM的启动参数

命令:jcmd pid VM.flags

E:\study\tool\javaSE1.8\jdk1.8\bin>jcmd 10172 VM.flags
10172:
-XX:CICompilerCount=3 -XX:InitialHeapSize=199229440 -XX:MaxHeapSize=3187671040 -XX:MaxNewSize=1062207488 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=66060288 -XX:OldSize=133169152 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC

除以上几个用法,jcmd还有其它command命令。可见jcmd是前面几节介绍到的命令集大成者。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值