在日常線上排查和性能調優中,除了 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
- 功能模塊:
- 監控(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
|
堆分析
|
對象分佈、泄漏分析
|
離線堆快照分析
|