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