內存洩漏如何排查?

使用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是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 使您能夠分析那些調試代碼可能無法發現的複雜問題。


分享到:


相關文章: