JVM常见工具总结
一、基础命令行工具(JDK自带)
jps:查看Java进程- 用途:列出当前用户的所有Java进程,包含主类及JVM参数。
- 命令示例:
jps -lvm(显示PID、主类、JVM参数)。 - 输出示例:如
1234 com.example.MainApp -Xmx2G。
jstat:监控JVM统计信息- 用途:实时查看堆内存、GC活动、类加载等数据。
- 常用命令:
jstat -gc <pid> 1000 10:每秒输出一次GC数据,共10次。jstat -gcutil <pid>:显示各内存区域使用百分比。
- 关键指标:
S0C/S1C:Survivor区容量。EU:Eden区使用量。OGC/OU:老年代容量/使用量。YGC/YGCT:Young GC次数/耗时。FGC/FGCT:Full GC次数/耗时。
jinfo:查看/修改JVM参数- 用途:动态查看或调整运行中JVM参数。
- 示例:
jinfo -flags <pid>:查看所有参数。jinfo -flag +PrintGC <pid>:启用GC日志打印。
jmap:生成堆内存快照- 用途:分析内存泄漏、对象分布。
- 常用命令:
jmap -dump:format=b,file=heap.hprof <pid>:生成堆转储文件。jmap -histo <pid>:显示堆中对象统计(直方图)。
- 分析工具:需配合MAT或VisualVM解析
.hprof文件。
jstack:生成线程快照- 用途:诊断线程死锁、高CPU问题。
- 命令示例:
jstack -l <pid> > thread_dump.txt。 - 分析技巧:
- 死锁检测:搜索输出中的
deadlock关键字。 - 高CPU线程定位:结合
top -Hp <pid>获取线程ID,转16进制后在jstack输出中查找。
- 死锁检测:搜索输出中的
jcmd:多功能诊断工具(JDK 7+)- 用途:替代部分
jmap、jstack功能,支持更多操作。 - 示例:
jcmd <pid> GC.heap_dump filename=heap.hprof:生成堆转储。jcmd <pid> Thread.print:打印线程栈(等效于jstack)。jcmd <pid> VM.flags:查看JVM参数。
- 用途:替代部分
二、图形化工具
JConsole
- 启动方式:
jconsole。 - 功能:
- 实时监控堆内存、线程、类加载、MBean。
- 检测死锁、手动执行GC。
- 适用场景:快速查看JVM总体状态。
- 启动方式:
VisualVM
- 启动方式:
jvisualvm。 - 功能:
- 分析堆转储、线程转储。
- 抽样器监控CPU、内存分配。
- 安装插件(如Visual GC)增强功能。
- 优势:集成多种工具,适合深度分析。
- 启动方式:
Java Mission Control(JMC)
- 用途:配合JDK Flight Recorder(JFR)实现低开销性能监控。
- 启用JFR:需在启动时添加参数
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder ...。 - 功能:
- 记录CPU、内存、IO事件。
- 生成详细分析报告。
三、高级工具与技巧
JHSDB(JDK 9+)
- 用途:分析堆、线程及JVM内部数据结构。
- 启动方式:
- 命令行模式:
jhsdb clhsdb。 - 生成堆转储:
jhsdb jmap --pid <pid> --dumpfile heap.hprof。
- 命令行模式:
Arthas(阿里开源工具)
- 功能:
- 动态跟踪方法调用、反编译代码、监控线程状态。
- 支持在线诊断。
- 常用命令:
dashboard:实时监控面板。thread -n 3:查看最忙的3个线程。watch com.example.Service * '{params, returnObj}':观察方法入参和返回值。
- 功能:
GC日志分析
- 启用方式:
- JDK 9+:
-Xlog:gc*:file=gc.log:time:filecount=5,filesize=10M。 - JDK 8:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log。
- JDK 9+:
- 分析工具:GCViewer、GCEasy(用于可视化GC日志)。
- 启用方式:
四、典型故障排查流程
内存泄漏(OOM)
- 步骤:
0. 使用jmap或jcmd生成堆转储。- 用MAT分析:查找
Retained Heap较高的对象。 - 检查代码中未关闭的资源(如数据库连接、流)。
- 用MAT分析:查找
- 步骤:
CPU使用率过高
- 步骤:
0.top -Hp <pid>:定位高CPU线程ID。- 转换线程ID为16进制(如
printf "%x" 1234)。 jstack <pid>:查找对应线程栈,定位问题代码。
- 转换线程ID为16进制(如
- 步骤:
线程死锁
- 步骤:
0.jstack <pid>:获取线程栈信息。- 搜索
deadlock关键字,分析死锁线程及锁信息。 - 检查同步块或锁顺序问题。
- 搜索
- 步骤:
五、命令速查表
| 场景 | 工具/命令 | 关键参数 |
|---|---|---|
| 查看Java进程 | jps | -lvm(显示详细信息) |
| 监控GC活动 | jstat | -gc、-gcutil |
| 生成堆转储 | jmap、jcmd | -dump、GC.heap_dump |
| 分析线程栈 | jstack、jcmd | Thread.print |
| 动态调整参数 | jinfo | -flag |
| 图形化监控 | VisualVM、JConsole | 安装插件增强功能 |
| 低开销记录 | JFR(JDK 7+) | -XX:+FlightRecorder |
| 在线诊断 | Arthas | dashboard、thread、watch |
六、注意事项
- 生产环境操作:生成堆转储或频繁监控可能影响性能,需谨慎使用。
- 权限要求:部分工具(如
jmap)需与目标JVM相同用户权限。 - JDK版本适配:部分功能(如
jcmd、JFR)需特定版本支持(JDK 7+)。
监控工具:JConsole、VisualVM、Prometheus+Grafana(生产环境); 分析工具:MAT(内存泄漏分析)、JProfiler(性能剖析)、GC日志分析工具(GCEasy); 命令行:jps(进程查询)、jstat(GC统计)、jmap(内存快照)、jstack(线程栈)、jhat(快照分析)
总结:掌握jps、jstat、jmap、jstack、jcmd等命令行工具及JConsole、VisualVM、JMC等图形化工具,结合GC日志分析和Arthas在线诊断,可高效定位JVM性能问题。建议优先通过监控收集数据,再针对性分析。
