文章目录
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是前面几节介绍到的命令集大成者。