注:
MAT查看到的內(nèi)容不一定是內(nèi)存泄露,需要具體分析。
使用MAT分析,最好能提前定位可能出現(xiàn)內(nèi)存泄露的類,然后借助MAT確認(rèn)是否出現(xiàn)泄露;優(yōu)先看retained heap 較大的類分析。
提前準(zhǔn)備:
1、下載MAT(Memory Analyzer Tool)
2、準(zhǔn)備標(biāo)準(zhǔn)HPROF文件(Heap/CPU Profiling)
MAT下載地址:
https://eclipse.org/mat/downloads.php
如本地沒有安裝eclipse,下載獨(dú)立包(stand-alone);
如本地安裝eclipse,把插件url添加到eclipse里在線安裝。
如下均使用MAT獨(dú)立版操作。
1、打開MAT
界面如下:

2、打開HPROF文件
(1)file–open file–對應(yīng)路徑下找到hprof文件,點(diǎn)擊打開
(2)MAT界面彈出引導(dǎo),如下圖
(3)選擇Leak Suspects Report (當(dāng)前關(guān)注點(diǎn)為檢測是否出現(xiàn)泄露)

3、OQL 查找
(1)打開OQL
OQL語法,類似SQL語句

(2)查找所有的Activity實(shí)例
輸入:select * from instanceof android.app.Activity
(還要其他指令用法,如懷疑某一activity可能有問題,輸入:select * from com.xxx.xx.ui.MainActivity)
檢索結(jié)果如下圖:

4、排除非強(qiáng)引用
Strong Ref(強(qiáng)引用):通常我們編寫的代碼都是Strong Ref,于此對應(yīng)的是強(qiáng)可達(dá)性,只有去掉強(qiáng)可達(dá),對象才被回收。
Soft Ref(軟引用):對應(yīng)軟可達(dá)性,只要有足夠的內(nèi)存,就一直保持對象,直到發(fā)現(xiàn)內(nèi)存吃緊且沒有Strong Ref時(shí)才回收對象。一般可用來實(shí)現(xiàn)緩存,通過java.lang.ref.SoftReference類實(shí)現(xiàn)。
Weak Ref(弱引用):比Soft Ref更弱,當(dāng)發(fā)現(xiàn)不存在Strong Ref時(shí),立刻回收對象而不必等到內(nèi)存吃緊的時(shí)候。通過java.lang.ref.WeakReference和java.util.WeakHashMap類實(shí)現(xiàn)。
Phantom Ref(虛引用):根本不會(huì)在內(nèi)存中保持任何對象,你只能使用Phantom Ref本身。一般用于在進(jìn)入finalize()方法后進(jìn)行特殊的清理過程,通過 java.lang.ref.PhantomReference實(shí)現(xiàn)。
(1)檢索結(jié)果中有兩個(gè)WebViewActivity,可能有泄露
(2)右鍵Merge Shortest Path to GC Roots,可選擇exclude weak reference(排除弱引用)、或者exclude phantom/weak/soft reference(排除軟/弱/虛引用)

(3)排除非強(qiáng)引用,結(jié)果如下
分析:最底部WebViewActivity被上一級(jí)mcontext對象持有,無法釋放。(代碼中查看下,這里可能是問題,也可能并不是問題)

5、其他MAT常用功能,后續(xù)補(bǔ)充
另一種內(nèi)存泄露分析思路:
查看Dominator Tree,從Retained Heap最大的類入手分析