首頁>Club>
3
回覆列表
  • 1 # Hely

    使用MAT工具排查記憶體洩漏的問題一.概要說明

    使用 Memory Analyzer 來分析生產環境的 Java 堆轉儲檔案,可以從數以百萬計的物件中快速計算出物件的 Retained Size,檢視是誰在阻止垃圾回收,並自動生成一個 Leak Suspect(記憶體洩露可疑點)報表。

    備註:Shallow Heap :一個物件記憶體的消耗大小,不包含對其他物件的引用

    Retained Heap :是shallow Heap的總和,也就是該物件被GC之後所能回收到記憶體的

    二.操作步驟

    1.初步判定是否存在記憶體洩漏問題,壓測前後記憶體空間是否釋放。使用命令:free –h

    2.若存在記憶體洩漏,使用命令:jmap -dump:live,format=b,file=heap.hrof <pid>。

    pid是JVM程序的id,

    heap.hrof

    是生成的檔名稱,在執行命令的目錄下面。

    備註:在JVM的配置引數中可以新增 -XX:+HeapDumpOnOutOfMemoryError 引數,當應用拋OutOfMemoryError 時自動生成dump檔案。

    3.使用MAT工具開啟heap檔案。

    4.開啟工具後,重點關注幾個選項:

    備註:點選Details進入詳情頁面。在詳情頁面Shortest Paths To the Accumulation Point表示GC root到記憶體消耗聚集點的最短路徑,如果某個記憶體消耗聚集點有路徑到達GC root,則該記憶體消耗聚集點不會被當做垃圾被回收。

    備註:Class Name : 類名稱,java類名

    Objects : 類的物件的數量,這個物件被建立了多少個

    Shallow Heap :一個物件記憶體的消耗大小,不包含對其他物件的引用

    Retained Heap :是shallow Heap的總和,也就是該物件被GC之後所能回收到記憶體的

    補充:

    為了找到記憶體洩露,獲取了兩個堆轉儲檔案,兩個檔案獲取時間間隔是一天(因為記憶體只是小幅度增長,短時間很難發現問題)。對比兩個檔案的物件,透過對比後的結果可以很方便定位記憶體洩露。

    MAT同時開啟兩個堆轉儲檔案,分別開啟Histogram,選擇Group By package,然後對比各物件的變化。

    三.總結

    MAT可以用它來分析記憶體問題,也可以用來監控整個 Java 應用程式的狀態和行為。透過讀取應用程式執行時由 Java 執行時環境生成的轉儲檔案快照,Memory Analyzer 使您能夠分析那些除錯程式碼可能無法發現的複雜問題。

  • 中秋節和大豐收的關聯?
  • 寶寶吃白粥應該配什麼醬菜?