JVM(Java虚拟机)的分析工具种类繁多,涵盖性能监控、内存分析、线程诊断、垃圾回收优化等多个方面。以下是一些常用的工具分类及示例,帮助你在不同场景下进行JVM问题排查和优化:
一、JDK自带工具(命令行)
-
jps
- 用途:查看当前系统中Java进程的PID和主类名。
- 示例:
jps -l
显示完整的包路径。
-
jstat
- 用途:监控JVM统计信息(类加载、GC、编译情况等)。
- 示例:
jstat -gcutil <pid> 1000
每秒输出一次GC情况。
-
jstack
- 用途:生成线程快照,分析死锁、线程阻塞等问题。
- 示例:
jstack -l <pid> > thread_dump.txt
导出线程堆栈。
-
jmap
- 用途:生成堆内存快照(Heap Dump),分析内存泄漏。
- 示例:
jmap -dump:format=b,file=heap.bin <pid>
导出二进制堆转储文件。
-
jhat
- 用途:分析堆转储文件(需浏览器访问)。
- 示例:
jhat heap.bin
启动本地HTTP服务分析堆文件。
-
jcmd
- 用途:多功能工具,支持生成堆转储、线程快照、JFR等。
- 示例:
jcmd <pid> GC.run
手动触发Full GC。
二、可视化工具
-
JConsole
- 用途:监控堆内存、线程、类加载、MBean等,适合基础性能分析。
- 启动:命令行输入
jconsole
。
-
VisualVM
- 用途:功能更强大的可视化工具,支持插件扩展(如分析CPU、内存、线程等)。
- 插件推荐:Visual GC(实时监控GC)、BTrace(动态追踪代码)。
-
Eclipse Memory Analyzer (MAT)
- 用途:分析堆转储文件,定位内存泄漏(如支配树、泄漏疑点报告)。
- 关键功能:
Histogram
(对象分布)、Leak Suspects
(泄漏分析)。
-
Java Mission Control (JMC)
- 用途:结合Java Flight Recorder(JFR)进行低开销的性能分析。
- 场景:生产环境监控(需JDK商业许可,但OpenJDK 11+已开源)。
三、第三方工具
-
Arthas(阿里巴巴开源)
- 用途:在线诊断工具,支持动态修改代码、监控方法执行耗时、跟踪调用链路。
- 常用命令:
watch com.example.MyClass methodName
监控方法入参和返回值。thread -b
检测死锁。jad com.example.MyClass
反编译类。
-
JProfiler
- 用途:商业性能分析工具,支持CPU、内存、线程分析,可视化界面友好。
- 亮点:CPU热点方法分析、内存分配追踪、数据库调用监控。
-
YourKit
- 用途:类似JProfiler的商业工具,支持CPU和内存分析,低性能开销。
-
Async Profiler
- 用途:高性能分析工具,支持CPU、内存分配、锁竞争分析。
- 示例:生成火焰图
./profiler.sh -d 30 -f flamegraph.html <pid>
。
四、GC日志分析工具
-
GCViewer
- 用途:分析GC日志文件,统计停顿时间、吞吐量、内存变化等。
- 输入:需启用JVM的GC日志参数(如
-Xloggc:gc.log
)。
-
GCEasy
- 用途:在线GC日志分析工具,自动生成可视化报告(如停顿时间分布、内存泄漏警告)。
五、生产环境诊断工具
-
Prometheus + Grafana
- 用途:监控JVM指标(如堆内存、GC时间、线程数),需配合JMX Exporter。
- 指标来源:通过JMX暴露的MBean(如
java.lang:type=Memory
)。
-
ELK(Elasticsearch + Logstash + Kibana)
- 用途:集中分析JVM日志(如GC日志、应用日志)。
六、高级调试工具
-
BTrace
- 用途:动态追踪Java程序,无需重启(如监控方法参数、返回值)。
- 限制:需注意安全性和性能影响。
-
JMH (Java Microbenchmark Harness)
- 用途:微基准测试工具,分析代码片段的性能(如对比不同算法的耗时)。
场景选择建议
- 快速线程分析:
jstack
或 Arthas 的thread
命令。 - 内存泄漏排查:
jmap
+ MAT 分析堆转储。 - 实时监控:VisualVM 或 Prometheus + Grafana。
- 低开销生产分析:JFR(Java Flight Recorder) + JMC。
- 动态诊断:Arthas 或 BTrace。
掌握这些工具的组合使用,可以高效定位JVM性能瓶颈、内存泄漏、线程死锁等问题。