如何使用MAT进行JVM内存泄露分析
轉載自??如何使用MAT進行JVM內存泄露分析
在《Java Agent的隔離實現以及卸載時一些坑》中,卸載Agent之后,使用 jmap-histo:live pid命令驗證執行FGC,相關Class是否會被回收,結果遇到了一些問題,最終通過MAT內存分析才定位到了問題,本文介紹如何使用MAT進行內存泄露分析。
MAT安裝
MAT是eclipse中的一個插件,不過也提供了獨立的版本,在IDEA風靡的今天,建議直接使用獨立版本,官網下載地址?
http://www.eclipse.org/mat/downloads.php?
根據操作系統版本下載最新的MAT
?
MAT配置
找到MemoryAnalyzer.ini文件,該文件里面有個Xmx參數,該參數表示最大內存占用量,默認為1024m,根據堆轉儲文件大小修改該參數即可。
獲取堆轉儲文件
1、如果想主動獲取,可以使用jamp命令,對于部署到服務器上的程序可以采用這種方式,獲取堆轉儲文件后scp到本地,然后本地分析。
2、如果想在發生內存溢出的時候自動dump,需要添加下面參數
MAT使用
打開MAT之后,加載dump文件,顯示下面的界面。
一般用到比較多的2個功能 1、Histogram 2、Leak Suspects
Histogram
這個功能主要是查看類和對象關系,對象和對象之間的關系,用來定位哪些對象在FGC之后還活著,哪些對象占大部分內存。
1、點開Histogram,可列出每一個類的實例數,支持正則表達式查找,也可以計算出該類所有對象的retained size。
?
Shallow Heap就是對象本身占用內存的大小,不包含其引用的對象內存,實際分析中作用不大。常規對象(非數組)的ShallowSize由其成員變量的數量和類型決定。數組的shallow size有數組元素的類型(對象類型、基本類型)和數組長度決定。對象成員都是些引用,真正的內存都在堆上,看起來是一堆原生的byte[], char[], int[],對象本身的內存都很小。
Retained Heap值的計算方式是將Retained Set(當該對象被回收時那些將被GC回收的對象集合)中的所有對象大小疊加?;蛘哒f,因為X被釋放,導致其它所有被釋放對象(包括被遞歸釋放的)所占的heap大小。
Retained Heap例子: 一個ArrayList對象持有100個對象,每一個占用16 bytes,如果這個list對象被回收,那么其中100個對象也可以被回收,可以回收16*100 + X的內存,X代表ArrayList的shallow大小。
所以,RetainedHeap可以更精確的反映一個對象實際占用的大小。
2、選擇一個Class,右鍵選擇List objects > with incoming references
?
在新頁面會顯示通過這個class創建的對象信息
3、選擇一個對象,右鍵選擇Path to GC Roots > **,通常在排查內存泄漏的時候,我們會選擇exclude all phantom/weak/soft etc.references, 意思是查看排除虛引用/弱引用/軟引用等的引用鏈,因為被虛引用/弱引用/軟引用的對象可以直接被GC給回收,我們要看的就是某個對象否還存在Strong 引用鏈(在導出HeapDump之前要手動出發GC來保證),如果有,則說明存在內存泄漏,然后再去排查具體引用。
?
這時會拿到GC Roots到該對象的路徑,通過對象之間的引用,可以清楚的看出這個對象沒有被回收的原因,然后再去定位問題。
假如說上面對象此時本來應該是被GC掉的,簡單的辦法就是將其中的某處置為null或者remove掉,使其到GC Root無路徑可達,處于不可觸及狀態,垃圾回收器就可以回收了。
Leak Suspects
Leak Suspects 界面提示可能存在內存的泄露。
?
然后接著,是問題一的描述,列出了一些比較大的實例。
?
點擊Details可以看到細節信息
?
點開Details進入詳情頁面,在詳情頁面Shortest Paths To the Accumulation Point表示GC root到內存消耗聚集點的最短路徑,如果某個內存消耗聚集點有路徑到達GC root,則該內存消耗聚集點不會被當做垃圾被回收。
內存快照對比
為了有效的找出內存泄露的對象,一般會獲取兩個堆轉儲文件(先dump一個,隔段時間再dump一個),并同時打開兩個dump文件。
打開其中一個Histogram,然后點擊下面按鈕。
?
選擇另外一個需要對比的dump文件
?
?
通過對比結果可以方便的看出對象的變化情況,并快速定位問題。
?
還不會使用的MAT的同學,趕緊學起來,機會都是留給有準備的人。
總結
以上是生活随笔為你收集整理的如何使用MAT进行JVM内存泄露分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 九号猎户座 Dz 110P 电动自行车发
- 下一篇: 三星 Galaxy Tab S9 FE