使用MAT分析內(nèi)存問(wèn)題

?使用MAT分析內(nèi)存問(wèn)題

在開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要分析應(yīng)用內(nèi)存,MAT(memory analyzer tool)可以幫助我們輕松分析內(nèi)存問(wèn)題。如何使用MAT分析和解決內(nèi)存問(wèn)題呢?大致可以按照下面的步驟進(jìn)行:

1. 發(fā)現(xiàn)內(nèi)存問(wèn)題

2. 分析heap文件

3. 解決內(nèi)存問(wèn)題

發(fā)現(xiàn)內(nèi)存問(wèn)題

發(fā)現(xiàn)內(nèi)存問(wèn)題的方式有很多種,甚至不借助工具,單純從用戶(hù)體驗(yàn)上感覺(jué)機(jī)器卡頓,都有可能是內(nèi)存問(wèn)題導(dǎo)致的。作為開(kāi)發(fā)者自然是需要高端一點(diǎn),推薦使用Android Device Monitor,在Android sdk/tools/目錄下運(yùn)行命令:

sudo ./monitor

可以啟動(dòng)Android Device Monitor。

手機(jī)連接usb,debug調(diào)試需要分析的進(jìn)程:


選中需要檢測(cè)的進(jìn)程,點(diǎn)擊“update heap”,然后點(diǎn)擊右側(cè)的“Cause GC”,就可以看到j(luò)ava heap的使用情況了:


在檢測(cè)的過(guò)程中,如果發(fā)現(xiàn)此時(shí)java heap出現(xiàn)了異常,點(diǎn)擊“dump HPROF file”按鈕,保存hprof文件。

分析heap文件

保存下來(lái)的hprof文件是不能被MAT直接識(shí)別的,需要做一次轉(zhuǎn)換。

進(jìn)入Android sdk/platform-tools/目錄,執(zhí)行如下命令:

sudo ./hprof-conv original.hprof new.hprof

轉(zhuǎn)化完成后,使用MAT打開(kāi)new.hprof,在MAT的Actions中,選擇“Histogram”:

會(huì)列出所有的類(lèi)的引用的內(nèi)存占用情況:

為了快速定位內(nèi)存問(wèn)題,在搜索欄輸入應(yīng)用的包名,過(guò)濾出最可能出問(wèn)題的對(duì)象,比如activity:

也可以直接搜索“android.graphics.Bitmap”,過(guò)濾出Bitmap對(duì)象。實(shí)際使用過(guò)程中靈活運(yùn)用:

Activity的引用,一般來(lái)說(shuō)多于一個(gè)就是有泄露了,需要重點(diǎn)關(guān)注。其他對(duì)象,可以根據(jù)數(shù)量來(lái)推測(cè),比如heap中包含了上百個(gè)Bitmap對(duì)象, 那就有可能是Bitmap不能被釋放,這就可能有問(wèn)題了。

除了根據(jù)數(shù)量來(lái)判斷以外,還可以根據(jù)Shallow Heap和Retained Heap的大小來(lái)判斷。Shallow Heap代表對(duì)象本身占用的heap,而Retained Heap代表這個(gè)對(duì)象被釋放后,所能釋放的總heap,這就包含了引用該對(duì)象的對(duì)象。

實(shí)際操作中,可以抓取兩個(gè)時(shí)間點(diǎn)的heap文件,觀察對(duì)象個(gè)數(shù)的變化和大小的變化來(lái)判斷內(nèi)存的問(wèn)題所在。當(dāng)我們找出了可能發(fā)生內(nèi)存泄露的對(duì)象,可以右擊該對(duì)象,選擇“List objects”->“with incoming references”。

1. with incoming references:列出所有包含改引用的對(duì)象

2. with outgoing references:列出改對(duì)象包含的所有引用

我們只關(guān)注包含該引用的對(duì)象:

展開(kāi)列表,再其中一個(gè)對(duì)象上右擊,點(diǎn)擊“Merge shortest path to GC roots”->"exclude all phantom/weak/soft etc. references"


這里會(huì)列出強(qiáng)引用此對(duì)象的對(duì)象,那么既然他持有了該對(duì)象的強(qiáng)引用,很有可能就是問(wèn)題所在:沒(méi)有及時(shí)釋放。

解決內(nèi)存問(wèn)題

看上圖的信息,大量的Bitmap對(duì)象被com.c.b.m e中的linkhashmap持有,接下就有的放矢的去代碼中,找到這個(gè)com.c.b.m e,加以分析解決啦。

MAT的使用就介紹到這里。是不是簡(jiǎn)單易用呢?

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

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

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