在日常線上排查和性能調優中,除了 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 分析 → 找出大對象 → 優化代碼或查詢
  1. CPU 高佔用分析
  • top -H -p <pid> 查看線程 CPU 佔用
  • jstack <pid> 導出線程棧 → 分析熱點代碼
  • VisualVM 可直接觀察方法調用耗時
  1. 線程阻塞/死鎖
  • JConsole/VisualVM 線程模塊可實時查看線程狀態
  • MAT 可分析線程對象持有的鎖

💡 總結

工具

類型

核心功能

使用場景

vmstat

系統監控

CPU/內存/swap/上下文切換

系統資源瓶頸分析

JConsole

GUI監控

堆內存/線程/類加載/CPU

JVM實時監控,小型服務調試

VisualVM

GUI調優

內存/線程/CPU/GC分析

全面 JVM 調優、內存泄漏分析

MAT

堆分析

對象分佈、泄漏分析

離線堆快照分析