首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

使用 Eclipse Memory Analyzer (MAT) 進行堆積轉儲分析:一鍵定位記憶體洩漏

     編輯:Java 相關知識

前言:為何需要堆積轉儲分析?

大型 Java 應用再嚴謹測試也難堵住所有漏洞,許多問題僅在生產環境暴露且難以重現。JVM 能在問題發生時記錄系統運行狀態至堆積轉儲檔案,為診斷提供關鍵依據。記憶體洩漏分析常被視為高難度工作,但 Eclipse Memory Analyzer (MAT) 被譽為「傻瓜式」分析工具,滑鼠點擊即生成專業報告,新手也能快速上手。

環境準備與安裝

  • Eclipse Memory Analyzer V0.8
  • Sun JDK 6

兩種安裝方式

  1. 整合版:透過 Update Manager 安裝為 Eclipse IDE 插件
    • Help > Software Updates > Available Software > Add Site: https://download.eclipse.org/technology/mat/0.8/update-site/
    • 啟動軟體更新管理員 新增 MAT 更新站點 選擇安裝功能
    • 重啟 Eclipse
  2. 獨立版 (RCP):下載安裝包解壓即用(普遍採用),下載頁面

分析 IBM JVM dump 需額外安裝 IBM Diagnostic Tool Framework。

記憶體配置優化

分析堆積轉儲需大量堆空間,建議分配最大記憶體:

  • 修改啟動參數:MemoryAnalyzer.exe -vmargs -Xmx4g
  • 或編輯 MemoryAnalyzer.ini 加入 -vmargs -Xmx4g

取得堆積轉儲檔案

Sun JDK 6 設定 JVM 參數自動產生:

  • -XX:+HeapDumpOnOutOfMemoryError:OOM 時自動產生
  • -XX:+HeapDumpOnCtrlBreak:Ctrl+Break 觸發產生

或使用工具主動獲取:

  • jmap -dump:format=b,file=<dumpfile> <pid>
  • JConsole 等圖形工具

本文範例使用 jmap 直接獲取 Eclipse Galileo 進程堆積轉儲。注意:MAT 支援主流廠商格式(Sun/HP/SAP 的 HPROF、IBM PHD),非萬能工具。

一鍵生成分析報告

  1. 啟動 MAT > File > Open Heap Dump 載入檔案
  2. 概覽介面(概覽介面)
  3. 檢視生成報告檔案列表(報告檔案列表)——MAT 將報告壓縮為 ZIP 並存放於原始檔案目錄,HTML 格式瀏覽器即可開啟,分享極便利
  4. 點擊工具列 "Leak Suspects" 或餅圖下方 "Reports > Leak Suspects" 生成洩漏分析報告(工具列選單)

三步曲分析法

  1. 掌握問題發生時系統記憶體整體狀況
  2. 找出最可能導致洩漏的元兇(通常為佔用記憶體最多的物件)
  3. 深入檢視該大戶具體情況,尋找異常行為

步驟 1:整體記憶體消耗狀況

記憶體洩漏分析報告

  • 餅圖清晰顯示:單一可疑物件佔用 99% 記憶體
  • 描述:java.util.Vector 實例由 com.ibm.oti.vm.BootstrapClassLoader 載入
  • 線索:哪個類別佔用多數記憶體、屬於哪個組件

步驟 2:分析問題根源——GC 根引用路徑

回顧 GC 機制:從 GC 根元素(執行緒、系統調用棧、系統類別載入器載入物件)出發層層引用。物件若被存活根元素引用即不可回收。分析物件到 GC 根的引用路徑可找出洩漏原因。

點擊 "Details" 連結查看可疑物件 1 詳細報告(可疑物件詳細報告),檢視從 GC 根到記憶體消耗聚集點的最短路徑(GC 根到聚集點最短路徑)。完整引用鏈清晰可見,熟悉程式碼者可獲洩漏思路。

步驟 3:深入聚集物件內容

記憶體消耗聚集物件資訊

  • 聚集物件為保存大量 Person 物件引用的集合
  • 確認為洩漏根源

原始碼驗證

回溯程式碼發現洩漏片段:


while (1 < 2) {
    Person person = new Person("name", "address", i);
    v.add(person);
    person = null;
}

無限迴圈持續建立 Person 並加入 Vector,雖將區域變數設為 null,但 Vector 仍持有引用導致無法 GC。

總結與進階功能

MAT 讓堆積轉儲分析極簡單,尤其適合新手。但 MAT 非僅「傻瓜工具」,還提供進階功能:

  • OQL (Object Query Language) 查詢堆積轉儲物件
  • 執行緒分析
  • 更多功能請參考 MAT 線上說明文件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved