下載:http://eclipse.org/mat/downloads.php
MAT工具全稱(chēng)為Memory Analyzer Tool,一款詳細(xì)分析Java堆內(nèi)存的工具幢哨,該工具非常強(qiáng)大道逗,為了使用該工具姚炕,我們需要hprof文件囊嘉。但是該文件不能直接被MAT使用谨履,需要進(jìn)行一步轉(zhuǎn)化这橙,可以使用hprof-conv命令來(lái)轉(zhuǎn)化奏窑,但是Android Studio可以直接轉(zhuǎn)化,轉(zhuǎn)化方法如下:
1.選擇一個(gè)hprof文件,點(diǎn)擊右鍵選擇Export to standard .hprof選項(xiàng)屈扎。
2.填寫(xiě)更改后的文件名和路徑:
點(diǎn)擊OK按鈕后埃唯,MAT工具所需的文件就生成了,下面我們用MAT來(lái)打開(kāi)該工具:
1.打開(kāi)MAT后選擇File->Open File選擇我們剛才生成的doctorq.hprof文件
2.選擇該文件后鹰晨,MAT會(huì)有幾秒種的時(shí)間解析該文件墨叛,有的hprof文件可能過(guò)大止毕,會(huì)有更長(zhǎng)的時(shí)間解析,解析后漠趁,展現(xiàn)在我們的面前的界面如下:
這是個(gè)總覽界面扁凛,會(huì)大體給出一些分析后初步的結(jié)論
Overview視圖
該視圖會(huì)首頁(yè)總結(jié)出當(dāng)前這個(gè)Heap dump占用了多大的內(nèi)存,其中涉及的類(lèi)有多少闯传,對(duì)象有多少谨朝,類(lèi)加載器,如果有沒(méi)有回收的對(duì)象甥绿,會(huì)有一個(gè)連接字币,可以直接參看(圖中的Unreachable Objects Histogram)。 比如該例子中顯示了Heap dump占用了41M的內(nèi)存共缕,5400個(gè)類(lèi)洗出,96700個(gè)對(duì)象,6個(gè)類(lèi)加載器图谷。 然后還會(huì)有各種分類(lèi)信息:
Biggest Objects by Retained Size
會(huì)列舉出Retained Size值最大的幾個(gè)值共苛,你可以將鼠標(biāo)放到餅圖中的扇葉上,可以在右側(cè)看出詳細(xì)信息:
圖中灰色區(qū)域蜓萄,并不是我們需要關(guān)心的,他是除了大內(nèi)存對(duì)象外的其他對(duì)象澄峰,我們需要關(guān)心的就是圖中彩色區(qū)域嫉沽,比如圖中2.4M的對(duì)象,我們來(lái)看看該對(duì)象到底是啥:
該對(duì)象是一個(gè)Bitmap對(duì)象俏竞,你如果想知道該對(duì)象到底是什么圖片绸硕,可以使用圖片工具gimp工具瀏覽該對(duì)象.
histogram視圖
histogram視圖主要是查看某個(gè)類(lèi)的實(shí)例個(gè)數(shù),比如我們?cè)跈z查內(nèi)存泄漏時(shí)候魂毁,要判斷是否頻繁創(chuàng)建了對(duì)象玻佩,就可以來(lái)看對(duì)象的個(gè)數(shù)來(lái)看。也可以通過(guò)排序看出占用內(nèi)存大的對(duì)象:
默認(rèn)是類(lèi)名形式展示席楚,你也可以選擇不同的顯示方式咬崔,有以下四種方式:
下面來(lái)演示一下:
Dominator tree視圖
該視圖會(huì)以占用總內(nèi)存的百分比來(lái)列舉所有實(shí)例對(duì)象,注意這個(gè)地方是對(duì)象而不是類(lèi)了烦秩,這個(gè)視圖是用來(lái)發(fā)現(xiàn)大內(nèi)存對(duì)象的垮斯。這些對(duì)象都可以展開(kāi)查看更詳細(xì)的信息,可以看到該對(duì)象內(nèi)部包含的對(duì)象:
Leaks suspects視圖
這個(gè)視圖會(huì)展示一些可能的內(nèi)存泄漏的點(diǎn)只祠,比如上圖上圖顯示有3個(gè)內(nèi)存泄漏可疑點(diǎn)兜蠕,我們以Problem Suspect 1為例來(lái)理解該報(bào)告,首先我們來(lái)看該可疑點(diǎn)詳細(xì)信息:
上面信息顯示ImageCahe類(lèi)的一個(gè)實(shí)例0xa50819f8占用了14.19%的內(nèi)存抛寝,具體值為5147200字節(jié)(5147200/1024/1024=4.9M),并存放在LinkedHashMap這個(gè)集合中熊杨,然后我們點(diǎn)擊Details跳轉(zhuǎn)到更詳細(xì)的頁(yè)面:
這樣我們就能找到在我們的app源碼中造成該泄漏可疑點(diǎn)的地方曙旭,很容易去定位問(wèn)題.