如何排查內存泄漏


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM