JVM:使用 MAT 工具結合jmap命令分析記憶體洩漏
阿新 • • 發佈:2018-12-16
1、下載MAT工具
2、演示記憶體溢位
- 新建一個springboot專案,新建一個controller
@RestController public class HeapControler { private ArrayList<User> arrayList = new ArrayList<User>(); @GetMapping("/heapmmo") public void heapDemo(){ while (true) { //死迴圈導致記憶體溢位 arrayList.add(new User("213","231")); } } }
- 修改虛擬機器 vm,新增 -Xmx32M -Xms32M
- 執行springboot專案,訪問 http://localhost:8080/heapmmo
3、使用 jmap 匯出記憶體映像檔案
-
開啟cmd,進入桌面
-
執行命令
jps
,檢視springboot專案的程序號
-
可以發現springboot程序號是 14036,執行命令
jmap -dump:format=b,file=a.hprof 14036
-
桌面會生成一個 a.hprof 的檔案
4、使用 MAT 開啟,File —> open file —> a.hprof
可以發現可能導致的問題有兩個,然後分析這兩個問題:
首先第一個,點選 details
通過第3行,基本上能夠定位到我們的 controller。
- 另外,我們可以點選左上角第二個圖示,通過物件數量定位異常
在第一行輸入匹配規則,我們匹配我們自己的專案 com.eaphy ,可以看出User類的數量達到了46萬多個,肯定是不正常的。
然後,右鍵User,找到是哪個GC Roots引用了該物件
可以清楚的看到,是HeapControler 裡面的 arraylist。
- 另外,我們可以點選左上角第三個圖示,通過物件佔記憶體的百分比定位異常
第一個和其他比起來,明顯佔比太大,可能不正常,然後,展開該行資料,定位到具體檔案