Java 工具集教程

jcmd.exe Java命令行工具

jcmd 是 JDK 自带的一个命令行工具,用于向正在运行的 Java 进程发送诊断命令。通过 jcmd 命令,可以获取 Java 进程的信息、执行诊断操作,以及触发一些特定的操作,例如线程转储、GC 操作、JVM 性能监控等。

命令格式

jcmd <pid | main class> <command ...|PerfCounter.print|-f file>
jcmd -l
jcmd -h

命令选项

  • <pid> 是目标 Java 进程的进程 ID,如果 pid 为 0,命令将发送给所有 Java 进程。

  • <main class> 是目标 Java 进程的主类名。

  • <command> 是要执行的诊断命令,例如 Thread.print、GC.run 等,必须是所选 jvm 的有效 jcmd 命令。可以使用“help”命令可查看哪些命令可用。

  • <command options> 是命令的选项参数。

PerfCounter.print 显示该进程暴露的计数器:

  • -f  从文件中读取并执行命令

  • -l  列出本地机器上的 JVM 进程

  • -h  帮助信息

注意:如果未给出任何选项,将列出 Java 进程(与 -p)相同。

命令示例

以下是 jcmd 命令的一些常见用法和常用命令:

(1)列出正在运行的 Java 进程的 ID,例如:

C:\Program Files\Java\jdk1.8.0_171\bin> jcmd -l
22848 sun.tools.jcmd.JCmd -l
11848
1768 org.jetbrains.jps.cmdline.Launcher ...
23176 org.jetbrains.jps.cmdline.Launcher ...
24008
28456 org.jetbrains.jps.cmdline.Launcher ...
24412 com.hxstrive.demo202312.Demo20231207193016
5644 org.jetbrains.jps.cmdline.Launcher ...

(2)列出指定 Java 进程的诊断命令列表,例如:

C:\Program Files\Java\jdk1.8.0_171\bin> jcmd 24412 help
24412:
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>'

(3)执行线程转储(类似于 jstack 命令),例如:

C:\Program Files\Java\jdk1.8.0_171\bin>jcmd 24412 Thread.print
24412:
2023-12-07 19:34:18
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.171-b11 mixed mode):

"Service Thread" #11 daemon prio=9 os_prio=0 tid=0x000000001ebdf000 nid=0x11d4 runnable [0x0000000000000000]
  java.lang.Thread.State: RUNNABLE

"C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x000000001eb39800 nid=0x4f68 waiting on condition [0x0000000000000000]
  java.lang.Thread.State: RUNNABLE

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

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

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

"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x000000001eb16800 nid=0x7104 runnable [0x000000001f23e000]
  java.lang.Thread.State: RUNNABLE
       at java.net.SocketInputStream.socketRead0(Native Method)
       at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
       at java.net.SocketInputStream.read(SocketInputStream.java:171)
       at java.net.SocketInputStream.read(SocketInputStream.java:141)
       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 <0x000000076c503340> (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 <0x000000076c503340> (a java.io.InputStreamReader)
       at java.io.BufferedReader.readLine(BufferedReader.java:389)
       at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:53)

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

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

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x000000001ea60800 nid=0xbd8 in Object.wait() [0x000000001ef3e000]
  java.lang.Thread.State: WAITING (on object monitor)
       at java.lang.Object.wait(Native Method)
       - waiting on <0x000000076c388ed0> (a java.lang.ref.ReferenceQueue$Lock)
       at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
       - locked <0x000000076c388ed0> (a java.lang.ref.ReferenceQueue$Lock)
       at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
       at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:212)

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x000000000330a000 nid=0x28fc in Object.wait() [0x000000001ea3f000]
  java.lang.Thread.State: WAITING (on object monitor)
       at java.lang.Object.wait(Native Method)
       - waiting on <0x000000076c386bf8> (a java.lang.ref.Reference$Lock)
       at java.lang.Object.wait(Object.java:502)
       at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
       - locked <0x000000076c386bf8> (a java.lang.ref.Reference$Lock)
       at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

"main" #1 prio=5 os_prio=0 tid=0x0000000003214000 nid=0x2864 waiting on condition [0x0000000002f8f000]
  java.lang.Thread.State: TIMED_WAITING (sleeping)
       at java.lang.Thread.sleep(Native Method)
       at com.huangxin.demo202312.Demo20231207193016.main(Demo20231207193016.java:12)

"VM Thread" os_prio=2 tid=0x000000001cb69000 nid=0x2fbc runnable

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000003229000 nid=0x4b68 runnable

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x000000000322b000 nid=0x417c runnable

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x000000000322c800 nid=0x28b0 runnable

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x000000000322e000 nid=0x272c runnable

"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x0000000003231000 nid=0x94c runnable

"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x0000000003232800 nid=0x1020 runnable

"GC task thread#6 (ParallelGC)" os_prio=0 tid=0x0000000003235800 nid=0x72e4 runnable

"GC task thread#7 (ParallelGC)" os_prio=0 tid=0x0000000003236800 nid=0x370 runnable

"VM Periodic Task Thread" os_prio=2 tid=0x000000001ec40000 nid=0x1d10 waiting on condition

JNI global references: 12

(4)执行 GC 操作(类似于 jmap -histo 命令),例如:

C:\Program Files\Java\jdk1.8.0_171\bin> jcmd 24412 GC.run
24412:
Command executed successfully

(5)执行 JFR(Java Flight Recorder)相关操作,例如:

C:\Program Files\Java\jdk1.8.0_171\bin> jcmd 24412 JFR.start
24412:
Java Flight Recorder not enabled.

Use VM.unlock_commercial_features to enable.

C:\Program Files\Java\jdk1.8.0_171\bin> jcmd 24412 JFR.stop
24412:
Java Flight Recorder not enabled.

Use VM.unlock_commercial_features to enable.
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号