寫了一個死循環不斷的創建對象,模擬內存溢出
1 package com.zuo.test1; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class Main { 7 8 public static void main(String[] args) { 9 List<Demo> demos=new ArrayList<>(); 10 while(true){ 11 demos.add(new Demo()); 12 } 13 } 14 15 16 }
修改啟動參數。
Apply
運行。
出現堆溢出錯誤,這時就會在本項目下出現xxx.hprof
然后再使用MAT工具引入此文件。進行分析。
通過MAT發現heap dump問題所在,就需要尋找導致內存泄漏的代碼點。這時往往需要打開對象依賴關系樹形視圖,點擊如圖按鈕即可。
為了更有效率的使用 MAT,我們可以配置一些環境參數。因為通常而言,分析一個堆轉儲文件需要消耗很多的堆空間,為了保證分析的效率和性能,在有條件的情況下,我們會建議分配給 MAT 盡可能多的內存資源。你可以采用如下兩種方式來分配內存更多的內存資源給 MAT。
一種是修改啟動參數 MemoryAnalyzer.exe-vmargs -Xmx4g
另一種是編輯文件 MemoryAnalyzer.ini,在里面添加類似信息 -vmargs– Xmx4g。
說明:
1. MemoryAnalyzer.ini中的參數一般默認為-vmargs– Xmx1024m,這就夠用了。假如你機器的內存不大,改大該參數的值,會導致MemoryAnalyzer啟動時,報錯:Failed to create the Java Virtual Machine。
2.當你導出的dump文件的大小大於你配置的1024m(說明1中,提到的配置:-vmargs– Xmx1024m),MAT輸出分析報告的時候,會報錯:An internal error occurred during: "Parsing heap dump from XXX”。適當調大說明1中的參數即可。