JDK命令行工具
JDK 自带了很多命令行工具,用于观察和诊断 JVM。线上环境中,这些工具往往比图形化工具更实用。
# 1. jps
jps 用于查看当前机器上的 Java 进程。
jps -l
常见输出:
12345 com.example.Application
拿到进程 ID 后,就可以使用其他工具继续分析。
# 2. jstat
jstat 用于查看 JVM 运行时统计信息,常用于观察 GC。
jstat -gcutil 12345 1000 10
表示每 1 秒输出一次,共输出 10 次。
关注指标:
- 新生代使用率。
- 老年代使用率。
- GC 次数。
- GC 时间。
# 3. jinfo
jinfo 用于查看或修改部分 JVM 参数。
jinfo -flags 12345
可以查看 JVM 启动参数。
注意:不是所有参数都能运行时修改,生产环境修改参数要谨慎。
# 4. jstack
jstack 用于生成线程转储。
jstack -l 12345 > thread.dump
常用于排查:
- CPU 飙高。
- 死锁。
- 线程阻塞。
- 线程池耗尽。
- 请求卡住。
# 5. jmap
jmap 可用于查看堆信息、生成堆转储。
jmap -dump:format=b,file=heap.hprof 12345
注意:生成 dump 可能触发停顿,dump 文件可能很大,线上使用要评估影响。
# 6. jcmd
jcmd 是功能非常强的综合诊断工具。
查看支持命令:
jcmd 12345 help
常用命令:
jcmd 12345 VM.flags
jcmd 12345 GC.heap_info
jcmd 12345 Thread.print
jcmd 12345 GC.class_histogram
jcmd 12345 JFR.start
很多场景中,jcmd 可以替代或增强 jmap、jstack、jinfo 的能力。
# 7. javap
javap 用于查看 class 文件信息和字节码。
javap -c -v Hello.class
常用于学习字节码、分析编译结果、理解语法糖。
# 8. jfr 与 jcmd
JFR(Java Flight Recorder)可以记录 JVM 运行事件,如:
- CPU。
- 分配。
- 锁。
- GC。
- IO。
- 线程。
可以通过 jcmd 启动和停止 JFR。
# 9. 阶段小结
JDK 命令行工具是 JVM 排障基本功。jps 找进程,jstat 看 GC 趋势,jstack 看线程,jmap 看堆,jcmd 做综合诊断,javap 看字节码。熟练使用这些工具,比记住大量参数更实用。
# 10. 工具选择流程
遇到线上问题
│
├─ 不知道进程号
│ └─ jps / ps
│
├─ 怀疑 GC
│ ├─ jstat
│ └─ GC 日志
│
├─ 怀疑线程阻塞/死锁/CPU
│ └─ jstack / jcmd Thread.print
│
├─ 怀疑堆内存
│ ├─ jcmd GC.class_histogram
│ └─ jmap / jcmd GC.heap_dump
│
├─ 怀疑运行时综合性能
│ └─ JFR
│
└─ 怀疑字节码/版本
└─ javap
# 11. 线上执行风险表
| 工具 | 风险 | 建议 |
|---|---|---|
jps | 低 | 可放心使用 |
jstat | 低 | 适合持续观察 |
jstack | 较低 | 高峰可用,但避免过频 |
jmap -dump | 中到高 | 大堆可能停顿,低峰执行 |
jcmd GC.heap_dump | 中到高 | 同样注意停顿和磁盘 |
| JFR | 低到中 | profile 配置比 default 开销高 |
# 12. Tips 快问快答
Q:jmap dump 会不会影响线上?
A:可能会。大堆 dump 可能触发 STW,并产生巨大文件。
Q:jstat 能定位内存泄漏对象吗?
A:不能。它能看趋势,具体对象要看 heap dump 或 class histogram。
Q:jstack 抓一次够吗?
A:通常不够。线程问题建议连续抓多次对比。
Q:jcmd 和 jmap/jstack 什么关系?
A:jcmd 是更统一的诊断入口,很多能力可以覆盖或增强传统工具。