Java 性能监控与分析工具
在日常线上排查和性能调优中,除了 top
、jmap
、jstat
等命令行工具外,Java 自带和第三方 GUI 工具也非常重要,能更直观地观察 JVM 内存、线程、GC 等状态。
1️⃣ 系统级监控工具
vmstat
- 作用:周期性统计虚拟内存、CPU、swap 使用情况,并可观察进程上下文切换。
- 命令示例:
vmstat 1 20
- 说明:每秒采集一次,共 20 次,可快速查看系统内存与 CPU 的实时变化,以及上下文切换次数,帮助判断系统瓶颈。
2️⃣ Java 自带 GUI 监控工具
JConsole(Java Monitoring and Management Console)
-
作用:基于 JMX(Java Management Extensions),可监控 JVM 内存、线程、类加载等性能指标。
-
启动方式:
-
在 JDK
bin
目录下双击jconsole.exe
或命令行执行:jconsole
-
-
功能亮点:
- 实时查看堆内存、非堆内存占用
- 线程监控及死锁检测
- 类加载信息与 CPU 使用情况
-
适用场景:适合快速在线监控小型服务的 JVM 状态,发现内存泄漏和线程阻塞。
VisualVM
- 作用:JDK 自带的强大调优工具,提供可视化界面监控 JVM,几乎覆盖所有 JVM 调优场景。
- 启动方式:
- 在 JDK
bin
目录下双击jvisualvm.exe
- 在 JDK
- 功能模块:
- 监控(Monitor):实时查看 CPU、堆内存、GC 活动情况
- 线程(Threads):线程活动状态、死锁检测
- Visual GC:可视化查看垃圾回收情况
- 插件安装:
- 主菜单 → “工具” → “插件”
- “可用插件”标签 → 勾选需要安装的插件 → “安装”
- 按步骤完成插件安装
- 实战用途:
- 内存泄漏分析:结合
Visual GC
或堆快照,查看内存占用大的对象 - 线程分析:发现死锁或阻塞线程
- CPU 性能分析:观察热点方法、方法调用耗时
- 垃圾回收跟踪:实时观察 GC 日志和各代内存变化
- 内存泄漏分析:结合
MAT(Memory Analyzer Tool)
- 作用:专业的堆分析工具,针对
heap dump
文件进行可视化分析。 - 使用流程:
- 使用
jmap -dump:live,format=b,file=heap.hprof <pid>
导出堆快照 - 将
.hprof
文件拷贝到本地 - 用 MAT 打开堆文件
- 使用 Leak Suspects Report 快速定位可能的内存泄漏对象
- 使用
- 典型应用:
- 查找大对象(如
com.mysql.jdbc.ByteArrayRow
) - 分析对象引用链,找到内存泄漏根源
- 优化内存分配和对象管理
- 查找大对象(如
3️⃣ 实战建议
- 排查内存泄漏
- 先用
jstat -gc <pid>
观察 GC 活动 - 导出堆快照 → MAT 分析 → 找出大对象 → 优化代码或查询
- 先用
- CPU 高占用分析
top -H -p <pid>
查看线程 CPU 占用jstack <pid>
导出线程栈 → 分析热点代码- VisualVM 可直接观察方法调用耗时
- 线程阻塞/死锁
- JConsole/VisualVM 线程模块可实时查看线程状态
- MAT 可分析线程对象持有的锁
💡 总结:
工具 | 类型 | 核心功能 | 使用场景 |
---|---|---|---|
vmstat | 系统监控 | CPU/内存/swap/上下文切换 | 系统资源瓶颈分析 |
JConsole | GUI监控 | 堆内存/线程/类加载/CPU | JVM实时监控,小型服务调试 |
VisualVM | GUI调优 | 内存/线程/CPU/GC分析 | 全面 JVM 调优、内存泄漏分析 |
MAT | 堆分析 | 对象分布、泄漏分析 | 离线堆快照分析 |