1. 程式人生 > >JVM:使用 MAT 工具結合jmap命令分析記憶體洩漏

JVM:使用 MAT 工具結合jmap命令分析記憶體洩漏

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"));
        }
    }
    
}

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。

  • 另外,我們可以點選左上角第三個圖示,通過物件佔記憶體的百分比定位異常

在這裡插入圖片描述


第一個和其他比起來,明顯佔比太大,可能不正常,然後,展開該行資料,定位到具體檔案
在這裡插入圖片描述