內(nèi)存分析—MAT詳細(xì)操作

注:

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最大的類入手分析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容