使用MAT工具排查內存泄漏的問題
一.概要說明
使用MemoryAnalyzer來分析生產環境的Java堆轉儲文件,可以從數以百萬計的對象中快速計算出對象的RetainedSize,查看是誰在阻止垃圾回收,并自動生成一個LeakSuspect(內存泄露可疑點)報表。
備注:ShallowHeap:一個對象內存的消耗大小,不包含對其他對象的引用
RetainedHeap:是shallowHeap的總和,也就是該對象被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.打開工具后,重點關注幾個選項:
Objects:類的對象的數量,這個對象被創建了多少個
ShallowHeap:一個對象內存的消耗大小,不包含對其他對象的引用
RetainedHeap:是shallowHeap的總和,也就是該對象被GC之后所能回收到內存的
為了找到內存泄露,獲取了兩個堆轉儲文件,兩個文件獲取時間間隔是一天(因為內存只是小幅度增長,短時間很難發現問題)。對比兩個文件的對象,通過對比后的結果可以很方便定位內存泄露。
MAT同時打開兩個堆轉儲文件,分別打開Histogram,選擇GroupBypackage,然后對比各對象的變化。