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

分析 IBM JVM dump 需額外安裝 IBM Diagnostic Tool Framework。
分析堆積轉儲需大量堆空間,建議分配最大記憶體:
MemoryAnalyzer.exe -vmargs -Xmx4gMemoryAnalyzer.ini 加入 -vmargs -Xmx4gSun JDK 6 設定 JVM 參數自動產生:
-XX:+HeapDumpOnOutOfMemoryError:OOM 時自動產生-XX:+HeapDumpOnCtrlBreak:Ctrl+Break 觸發產生或使用工具主動獲取:
jmap -dump:format=b,file=<dumpfile> <pid>本文範例使用 jmap 直接獲取 Eclipse Galileo 進程堆積轉儲。注意:MAT 支援主流廠商格式(Sun/HP/SAP 的 HPROF、IBM PHD),非萬能工具。
)
)——MAT 將報告壓縮為 ZIP 並存放於原始檔案目錄,HTML 格式瀏覽器即可開啟,分享極便利
)
java.util.Vector 實例由 com.ibm.oti.vm.BootstrapClassLoader 載入回顧 GC 機制:從 GC 根元素(執行緒、系統調用棧、系統類別載入器載入物件)出發層層引用。物件若被存活根元素引用即不可回收。分析物件到 GC 根的引用路徑可找出洩漏原因。
點擊 "Details" 連結查看可疑物件 1 詳細報告(
),檢視從 GC 根到記憶體消耗聚集點的最短路徑(
)。完整引用鏈清晰可見,熟悉程式碼者可獲洩漏思路。

Person 物件引用的集合回溯程式碼發現洩漏片段:
while (1 < 2) {
Person person = new Person("name", "address", i);
v.add(person);
person = null;
}
無限迴圈持續建立 Person 並加入 Vector,雖將區域變數設為 null,但 Vector 仍持有引用導致無法 GC。
MAT 讓堆積轉儲分析極簡單,尤其適合新手。但 MAT 非僅「傻瓜工具」,還提供進階功能: