什么是 jcmd?
jcmd 是 JDK 自带的一个命令行工具,位于 $JAVA_HOME/bin/jcmd,它通过 Attach API 连接到目标 JVM 进程,执行各种诊断命令。
核心优势
优势 | 说明 |
✅ 功能全面 | 支持线程、内存、GC、JFR、VM 参数等 |
✅ 权限要求低 | 只需与目标 JVM 同用户即可(比 |
✅ 无需额外配置 | 默认启用(除非 |
✅ 轻量级 | 不像 |
✅ 脚本友好 | 输出结构清晰,易于解析 |
实战:jcmd 五大核心命令
1. 查看所有 Java 进程(替代 jps)
jcmd输出:
12345 MyApp
67890 KafkaServer2. 查看 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 s8. 启动 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✅ 无需重启,动态开启性能分析!