在日常线上排查和性能调优中,除了 topjmapjstat 等命令行工具外,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
  • 功能模块
    1. 监控(Monitor):实时查看 CPU、堆内存、GC 活动情况
    2. 线程(Threads):线程活动状态、死锁检测
    3. Visual GC:可视化查看垃圾回收情况
  • 插件安装
    1. 主菜单 → “工具” → “插件”
    2. “可用插件”标签 → 勾选需要安装的插件 → “安装”
    3. 按步骤完成插件安装
  • 实战用途
    • 内存泄漏分析:结合 Visual GC 或堆快照,查看内存占用大的对象
    • 线程分析:发现死锁或阻塞线程
    • CPU 性能分析:观察热点方法、方法调用耗时
    • 垃圾回收跟踪:实时观察 GC 日志和各代内存变化

MAT(Memory Analyzer Tool)

  • 作用:专业的堆分析工具,针对 heap dump 文件进行可视化分析。
  • 使用流程
    1. 使用 jmap -dump:live,format=b,file=heap.hprof <pid> 导出堆快照
    2. .hprof 文件拷贝到本地
    3. MAT 打开堆文件
    4. 使用 Leak Suspects Report 快速定位可能的内存泄漏对象
  • 典型应用
    • 查找大对象(如 com.mysql.jdbc.ByteArrayRow
    • 分析对象引用链,找到内存泄漏根源
    • 优化内存分配和对象管理

3️⃣ 实战建议

  1. 排查内存泄漏
    • 先用 jstat -gc <pid> 观察 GC 活动
    • 导出堆快照 → MAT 分析 → 找出大对象 → 优化代码或查询
  2. CPU 高占用分析
    • top -H -p <pid> 查看线程 CPU 占用
    • jstack <pid> 导出线程栈 → 分析热点代码
    • VisualVM 可直接观察方法调用耗时
  3. 线程阻塞/死锁
    • JConsole/VisualVM 线程模块可实时查看线程状态
    • MAT 可分析线程对象持有的锁

💡 总结

工具 类型 核心功能 使用场景
vmstat 系统监控 CPU/内存/swap/上下文切换 系统资源瓶颈分析
JConsole GUI监控 堆内存/线程/类加载/CPU JVM实时监控,小型服务调试
VisualVM GUI调优 内存/线程/CPU/GC分析 全面 JVM 调优、内存泄漏分析
MAT 堆分析 对象分布、泄漏分析 离线堆快照分析
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐