?使用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)單易用呢?