使用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 :一個物件記憶體的消耗大小,不包含對其他物件的引用
補充:
為了找到記憶體洩露,獲取了兩個堆轉儲檔案,兩個檔案獲取時間間隔是一天(因為記憶體只是小幅度增長,短時間很難發現問題)。對比兩個檔案的物件,透過對比後的結果可以很方便定位記憶體洩露。
MAT同時開啟兩個堆轉儲檔案,分別開啟Histogram,選擇Group By package,然後對比各物件的變化。
MAT可以用它來分析記憶體問題,也可以用來監控整個 Java 應用程式的狀態和行為。透過讀取應用程式執行時由 Java 執行時環境生成的轉儲檔案快照,Memory Analyzer 使您能夠分析那些除錯程式碼可能無法發現的複雜問題。
使用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 使您能夠分析那些除錯程式碼可能無法發現的複雜問題。