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

Eclipse Memory Analyzer (MAT) 實戰:從堆溢出到內存洩漏分析完整流程

     編輯:Java 綜合教學

堆內存溢出 (OOM) 重現與 Dump 獲取

首先編寫一個必然觸發 OOM 的測試類,並配置 JVM 參數自動生成堆轉儲文件:

// VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
public class Heap_OOM {
    public static void main(String[] args) {
        List<Person> persons = new ArrayList<>();
        while (true) {
            persons.add(new Person());
        }
    }
}
class Person {}

Eclipse 運行配置設置

  1. Run Configurations → Arguments → VM Arguments 添加:-XX:+HeapDumpOnOutOfMemoryError
  2. 運行程序,控制台輸出:Dumping heap to java_pidXXXX.hprof ...
  3. 在工作目錄找到生成的 .hprof 文件

MAT 安裝與分析流程

Eclipse 參數配置 VM 參數設置 運行結果 OOM 生成 hprof 文件 MAT 打開堆轉儲 選擇分析報告 分析結果視圖

核心分析視圖解讀

  • Histogram:按類統計對象數量與淺堆/深堆大小,快速定位大對象
  • Dominator Tree:支配者樹,找出佔用內存最多的對象鏈路
  • Leak Suspects:自動檢測潛在內存洩漏點(如靜態集合持有引用)
  • Path to GC Roots:查看對象到 GC Roots 的引用路徑,判斷為何無法回收

實戰定位步驟

  1. 打開 Leak Suspects Report 查看自動分析建議
  2. 在 Histogram 中按 retained size 降序排列
  3. 右鍵可疑類 → List Objects → Path to GC Roots → Exclude Weak/Soft/Phantom References
  4. 分析引用鏈:ArrayList → Object[] → Person[] 確認業務邏輯無限添加

進階技巧

  • 使用 OQL 查詢:SELECT * FROM java.util.ArrayList WHERE size > 1000
  • 對比兩個堆快照:文件 → Compare Basket
  • 導出報告分享團隊:File → Export Report

參考資源:IBM DeveloperWorks MAT 詳細教程

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved