什么是 jcmd

jcmd 是 JDK 自带的一个命令行工具,位于 $JAVA_HOME/bin/jcmd,它通过 Attach API 连接到目标 JVM 进程,执行各种诊断命令。

核心优势

优势

说明

✅ 功能全面

支持线程、内存、GC、JFR、VM 参数等

✅ 权限要求低

只需与目标 JVM 同用户即可(比 jmap 更安全)

✅ 无需额外配置

默认启用(除非 -XX:-AttachMechanism 关闭)

✅ 轻量级

不像 jmap -dump 那样产生大文件

✅ 脚本友好

输出结构清晰,易于解析

实战:jcmd 五大核心命令

1. 查看所有 Java 进程(替代 jps

jcmd

输出:

12345 MyApp
67890 KafkaServer

2. 查看 JVM 启动参数(替代 jinfo -flags

jcmd 12345 VM.command_line

输出:

VM Arguments:
java_command: com.example.MyApp
java_options: -Xms512m -Xmx2g -Dspring.profiles.active=prod

再也不用问运维“这服务启动参数是啥”了!

3. 查看系统属性(替代 jinfo -sysprops

jcmd 12345 VM.system_properties

输出:

java.runtime.name=OpenJDK Runtime Environment
spring.application.name=myapp
...

4. 查看当前线程栈(替代 jstack

jcmd 12345 Thread.print

输出:

"main" #1 prio=5 os_prio=0 cpu=1234.56ms ...java.lang.Thread.State: RUNNABLEat com.example.MyApp.main(MyApp.java:10)
...
"HttpClient-1" #12 daemon ...java.lang.Thread.State: TIMED_WAITINGat java.base@17.0.1/java/lang/Thread.sleep(Native Method)

可直接分析死锁、阻塞、高 CPU 线程

5. 执行 GC(一键触发 Full GC)

jcmd 12345 GC.run

或更温和的:

jcmd 12345 GC.run_finalization

⚠️ 生产慎用,但可用于测试内存泄漏。

6. 生成堆转储(替代 jmap -dump

jcmd 12345 GC.run
jcmd 12345 VM.dumpheap /tmp/heap.hprof

jmap 更安全,某些环境下 jmap 会卡住或失败,而 jcmd 更稳定。

7. 查看 JVM 信息(版本、运行时间等)

jcmd 12345 VM.version

输出:

OpenJDK Runtime Environment (17.0.1+12-LTS)
OpenJDK 64-Bit Server VM (17.0.1+12-LTS, mixed mode)
jcmd 12345 VM.uptime

输出:

Uptime: 87654.321 s

8. 启动 JFR 飞行记录(无需 -XX:+FlightRecorder?错!)

⚠️ 注意:必须在启动时加 -XX:+FlightRecorder 才能使用 JFR 命令

# 开始录制(60秒)
jcmd 12345 JFR.start duration=60s filename=/tmp/recording.jfr# 立即停止
jcmd 12345 JFR.stop# 查看所有 recordings
jcmd 12345 JFR.check

无需重启,动态开启性能分析!