內(nèi)存分析工具 MAT 的使用

1 內(nèi)存泄漏的排查方法

Dalvik Debug Monitor Server (DDMS) 是 ADT插件的一部分灸叼,其中有兩項功能可用于內(nèi)存檢查 :
· heap 查看堆的分配情況
· allocation tracker跟蹤內(nèi)存分配情況
DDMS 這兩項功能有助于找到內(nèi)存泄漏的操作行為。
Eclipse Memory Analysis Tools (MAT) 是一個分析 Java堆數(shù)據(jù)的專業(yè)工具流部,用它可以定位內(nèi)存泄漏的原因关摇。
工具地址 : https://www.eclipse.org/mat/

1.1 觀察 Heap

· 運行程序捻脖,然后進入 DDMS管理界面,如下:

Paste_Image.png

PS : 點擊工具欄上的
Paste_Image.png

來更新統(tǒng)計信息
點擊右側(cè)的 Cause GC 按鈕或工具欄上的 [


Paste_Image.png

即可查看當前的堆情況擦盾,如下:

主要關(guān)注兩項數(shù)據(jù):
o Heap Size 堆的大小窗怒,當資源增加,當前堆的空余空間不夠時吏恭,系統(tǒng)會增加堆的大小拗小,若超過上限 (例如64M,視平臺和具體機型而定)則會被殺掉
o Allocated 堆中已分配的大小樱哼,這是應(yīng)用程序?qū)嶋H占用的內(nèi)存大小哀九,資源回收后,此項數(shù)據(jù)會變小
· 查看操作前后的堆數(shù)據(jù)搅幅,看是否有內(nèi)存泄漏 對單一操作(比如添加頁阅束,刪除頁)進行反復操作,如果堆的大小一直增加茄唐,則有內(nèi)存泄漏的隱患息裸。


1.2 利用MAT分析內(nèi)存堆

DDMS 可以將當前的內(nèi)存 Dump成一個 hprof格式的文件,MAT 讀取這個文件后會給出方便閱讀的信息沪编,配合它的查找呼盆,對比功能,就可以定位內(nèi)存泄漏的原因蚁廓。
· 獲取 hprof文件 點擊工具欄上的

按鈕访圃,將內(nèi)存信息保存成文件。 如果是用 MAT Eclipse 插件獲取的 Dump文件相嵌,則不需要經(jīng)過轉(zhuǎn)換腿时,Adt會自動進行轉(zhuǎn)換然后打開克胳。
· 轉(zhuǎn)換 hprof文件 DDMS Dump 出的文件要經(jīng)過轉(zhuǎn)換才能被 MAT識別,Android SDK提供了這個工具 hprof-conv (位于 sdk/tools下)
· ./hprof-conv xxx-a.hprof xxx-b.hprof
· 用 MAT打開轉(zhuǎn)換后的 hprof文件

1.3 Histogram 查詢

用的最多的功能是 Histogram,點擊 Actions下的 Histogram項將得到 Histogram結(jié)果:

Paste_Image.png

它按類名將所有的實例對象列出來圈匆,可以點擊表頭進行排序,在表的第一行可以輸入正則表達式來匹配結(jié)果 :

Paste_Image.png

在某一項上右鍵打開菜單選擇 list objects ->with incoming refs 將列出該類的實例:

Paste_Image.png

它展示了對象間的引用關(guān)系漠另,比如展開后的第一個子項表示這個 HomePage(0x420ca5b0)被HomePageContainer(0x420c9e40)中的 mHomePage屬性所引用.
快速找出某個實例沒被釋放的原因,可以右健 Path to GC Roots-->exclue all phantom/weak/soft etc. reference :

Paste_Image.png

得到的結(jié)果是:

Paste_Image.png

從表中可以看出 PreferenceManager -> … ->HomePage這條線路就引用著這個 HomePage實例跃赚。用這個方法可以快速找到某個對象的 GC Root,一個存在 GC Root的對象是不會被 GC回收掉的.

1.4 Histogram 對比

為查找內(nèi)存泄漏笆搓,通常需要兩個 Dump結(jié)果作對比,打開 Navigator History面板纬傲,將兩個表的 Histogram結(jié)果都添加到 Compare Basket中去 :

Paste_Image.png

添加好后满败,打開 Compare Basket面板,得到結(jié)果:

Paste_Image.png

點擊右上角的 ! 按鈕叹括,將得到比對結(jié)果:

Paste_Image.png

注意算墨,上面這個對比結(jié)果不利于查找差異,可以調(diào)整對比選項:

Paste_Image.png

再把對比的結(jié)果排序汁雷,就可得到直觀的對比結(jié)果:

Paste_Image.png

也可以對比兩個對象集合净嘀,方法與此類似,都是將兩個 Dump結(jié)果中的對象集合添加到Compare Basket中去對比侠讯。找出差異后用 Histogram查詢的方法找出 GC Root挖藏,定位到具體的某個對象上。

1.5 例子

舉例一個典型的分析內(nèi)存泄漏的過程:

  1. 使用 Heap查看當前堆大小為 23.00M
  2. 添加一個頁后堆大小變?yōu)?23.40M
  3. 將添加的一個頁刪除厢漩,堆大小為 23.40M
  4. 多次操作膜眠,結(jié)果仍相似,說明添加/刪除頁存在內(nèi)存泄漏 (也應(yīng)注意排除其它因素的影響)
  5. Dump 出操作前后的 hprof 文件 (1.hprof,2.hprof)溜嗜,用 mat打開,并得到 histgram結(jié)果
  6. 使用 HomePage字段過濾 histgram結(jié)果宵膨,并列出該類的對象實例列表,看到兩個表中的對象集合大小不同炸宵,操作后比操作前多出一個 HomePage辟躏,說明確實存在泄漏
  7. 將兩個列表進行對比,找出多出的一個對象焙压,用查找 GC Root的方法找出是誰串起了這條引用線路鸿脓,定位結(jié)束
    PS :
    · 很多時候堆增大是 Bitmap引起的,Bitmap在 Histogram中的類型是 byte [],對比兩個 Histogram中的 byte[]對象就可以找出哪些 Bitmap有差異
    · 多使用排序功能涯曲,對找出差異很有用

2 內(nèi)存泄漏的原因分析

總結(jié)出來只有一條: 存在無效的引用! 良好的模塊設(shè)計以及合理使用設(shè)計模式有助于解決此問題野哭。

3 Tips

· 使用 android:largeHeap="true"標記 (API Level >= 11) 在 AndroidManifest.xml中的 Application節(jié)點中聲明即可分配到更大的堆內(nèi)存, android:largeHeap標記在 Android系統(tǒng)應(yīng)用中也有廣泛的應(yīng)用 ,比如 Launcher, Browser這些內(nèi)存大戶上均有使用.

4 參考

· DDMS 官方教程 http://developer.android.com/tools/debugging/ddms.html
· MAT 下載 http://www.eclipse.org/mat/downloads.PHP
· MAT 使用 http://android-developers.blogspot.tw/2011/03/memory-analysis-for-android.html
同事起草,整理分享幻件,可以轉(zhuǎn)載收錄拨黔。
來自:http://blog.csdn.net/aaa2832/article/details/19419679

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绰沥,隨后出現(xiàn)的幾起案子篱蝇,更是在濱河造成了極大的恐慌贺待,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件零截,死亡現(xiàn)場離奇詭異麸塞,居然都是意外死亡,警方通過查閱死者的電腦和手機涧衙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門哪工,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人弧哎,你說我怎么就攤上這事雁比。” “怎么了撤嫩?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵偎捎,是天一觀的道長。 經(jīng)常有香客問我序攘,道長茴她,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任两踏,我火速辦了婚禮败京,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梦染。我一直安慰自己,他們只是感情好朴皆,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布帕识。 她就那樣靜靜地躺著,像睡著了一般遂铡。 火紅的嫁衣襯著肌膚如雪肮疗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天扒接,我揣著相機與錄音伪货,去河邊找鬼。 笑死钾怔,一個胖子當著我的面吹牛碱呼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宗侦,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼愚臀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了矾利?” 一聲冷哼從身側(cè)響起姑裂,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤馋袜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后舶斧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欣鳖,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年茴厉,在試婚紗的時候發(fā)現(xiàn)自己被綠了泽台。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡呀忧,死狀恐怖师痕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情而账,我是刑警寧澤胰坟,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站泞辐,受9級特大地震影響笔横,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咐吼,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一吹缔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锯茄,春花似錦厢塘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喂急,卻和暖如春格嘁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背廊移。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工糕簿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狡孔。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓懂诗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親步氏。 傳聞我的和親對象是個殘疾皇子响禽,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容