MAT使用進(jìn)階

Java的內(nèi)存泄露

  • Java中的內(nèi)存泄露主要特征:可達(dá),無用
  • 無用指的是創(chuàng)建了但是不再使用之后沒有釋放
  • 能重用但是卻創(chuàng)建了新的對(duì)象進(jìn)行處理

MAT使用技巧

使用Android Studio Dump內(nèi)存文件

Android Studio的最新版本可以直接獲取hprof文件:

image.png

然后選擇文件,點(diǎn)擊右鍵轉(zhuǎn)換成標(biāo)準(zhǔn)的hprof文件对妄,就可以在MAT中打開了。

在使用使用Eclipse或者AndroidStudio抓內(nèi)存之前裹纳,一定要手動(dòng)點(diǎn)擊 Initiate GC按鈕手動(dòng)觸發(fā)GC妆距,這樣抓到的內(nèi)存使用情況就是不包括Unreachable對(duì)象的懦趋。

image.png

Unreachable對(duì)象

Unreachable指的是可以被垃圾回收器回收的對(duì)象闯团,但是由于沒有GC發(fā)生辛臊,所以沒有釋放,這時(shí)抓的內(nèi)存使用中的Unreachable就是這些對(duì)象房交。

image.png
image.png

點(diǎn)擊Calculate Retained Size之后彻舰,會(huì)出現(xiàn)Retained Size這一列

image.png
image.png

可以看到Unreachable Object的對(duì)象其Retained Heap值都為0.這也是正常的。

Histogram

MAT中Histogram的主要作用是查看一個(gè)instance的數(shù)量候味,一般用來查看自己創(chuàng)建的類的實(shí)例的個(gè)數(shù)刃唤。

  • 可以很容易的找出占用內(nèi)存最多的幾個(gè)對(duì)象,根據(jù)Percentage(百分比)來排序白群。
  • 可以分不同維度來查看對(duì)象的Dominator Tree視圖透揣,Group by class、Group by class loader川抡、Group by package
    和Histogram類似,時(shí)間久了须尚,通過多次對(duì)比也可以把溢出對(duì)象找出來崖堤。
  • Dominator Tree和Histogram的區(qū)別是站的角度不一樣,Histogram是站在類的角度上去看耐床,Dominator Tree是站的對(duì)象實(shí)例的角度上看密幔,Dominator Tree可以更方便的看出其引用關(guān)系。
image.png

通過查看Object的個(gè)數(shù)撩轰,結(jié)合代碼就可以找出存在內(nèi)存泄露的類(即可達(dá)但是無用的對(duì)象胯甩,或者是可以重用但是重新創(chuàng)建的對(duì)象

Histogram中還可以對(duì)對(duì)象進(jìn)行Group昧廷,更方便查看自己Package中的對(duì)象信息。

image.png

Thread信息

MAT中可以查看當(dāng)前的Thread信息:

image.png

從圖中可以得到的信息:

  1. 可以看到可能有內(nèi)存問題的Thread:
image.png
  1. 可以看到數(shù)量可能有問題的Thread
image.png

幫助信息

MAT中的各個(gè)視圖中偎箫,在每一個(gè)Item中點(diǎn)擊右鍵會(huì)出現(xiàn)很多選項(xiàng)木柬,很多時(shí)候我們需要依賴這些選項(xiàng)來進(jìn)行分析:

image.png

這些選項(xiàng)的具體含義則可以通過右鍵中的Search Queries這個(gè)選項(xiàng)(上圖中的倒數(shù)第四個(gè)選項(xiàng))進(jìn)行搜索和查看,非常的有用淹办。

image.png

可以看到眉枕,所有的命令其實(shí)就是配置不同的SQL查詢語句。

比如我們最常用的:

  • List objects -> with incoming references:查看這個(gè)對(duì)象持有的外部對(duì)象引用
  • List objects -> with outcoming references:查看這個(gè)對(duì)象被哪些外部對(duì)象引用
  • Path To GC Roots -> exclude all phantim/weak/soft etc. references:查看這個(gè)對(duì)象的GC Root怜森,不包含虛速挑、弱引用、軟引用副硅,剩下的就是強(qiáng)引用姥宝。從GC上說,除了強(qiáng)引用外恐疲,其他的引用在JVM需要的情況下是都可以 被GC掉的腊满,如果一個(gè)對(duì)象始終無法被GC,就是因?yàn)閺?qiáng)引用的存在流纹,從而導(dǎo)致在GC的過程中一直得不到回收糜烹,因此就內(nèi)存溢出了。
  • Path To GC Roots -> exclude weak/soft references:查看這個(gè)對(duì)象的GC Root漱凝,不含弱引用和軟引用所有的引用.
  • **Merge Shortest path to GC root **:找到從GC根節(jié)點(diǎn)到一個(gè)對(duì)象或一組對(duì)象的共同路徑

Debug Bitmap

如果經(jīng)常使用MAT分析內(nèi)存疮蹦,就會(huì)發(fā)現(xiàn)Bitmap所占用的內(nèi)存是非常大的,這個(gè)和其實(shí)際顯示面積是有關(guān)系的茸炒。在2K屏幕上愕乎,一張Bitmap能達(dá)到20MB的大小。

所以要是MAT提供了一種方法壁公,可以將存儲(chǔ)Bitmap的byte數(shù)組導(dǎo)出來感论,使用第三方工具打開。這個(gè)大大提高了我們分析內(nèi)存泄露的效率紊册。

關(guān)于這個(gè)方法的操作流程比肄,可以參考這篇文章還原MAT中的Bitmap圖像.

Debug ArrayList

ArrayList是使用非常常用的一個(gè)數(shù)據(jù)結(jié)構(gòu),在MAT中囊陡,如果想知道ArrayList中有哪些數(shù)據(jù)芳绩,需要右鍵-> List Objects -> With outgoing references,然后可以看到下面的圖:

image.png

從上圖可以看到,這個(gè)ArrayList的內(nèi)容在一個(gè)array數(shù)組中撞反,即暴漏了ArrayList的內(nèi)部結(jié)構(gòu)妥色,查看的時(shí)候有點(diǎn)不方便,所以MAT提供了另外一種查看ArrayList內(nèi)數(shù)據(jù)的方式:

image.png

其結(jié)果非常直觀:

image.png

Big Drops In Dominator Tree

Big Drops In Dominator Tree選項(xiàng)在右鍵->

Displays memory accumulation points in the dominator tree. Displayed are objects with a big difference between the retained size of the parent and the children and the first "interesting" dominator of the accumulation point. These are places where the memory of many small objects is accumulated under one object.

image.png

作者:Gracker
鏈接:http://www.reibang.com/p/c8e0f8748ac0
來源:簡書
簡書著作權(quán)歸作者所有遏片,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處嘹害。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撮竿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笔呀,更是在濱河造成了極大的恐慌幢踏,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凿可,死亡現(xiàn)場離奇詭異惑折,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)枯跑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門惨驶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人敛助,你說我怎么就攤上這事粗卜。” “怎么了纳击?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵续扔,是天一觀的道長。 經(jīng)常有香客問我焕数,道長纱昧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任堡赔,我火速辦了婚禮识脆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘善已。我一直安慰自己灼捂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布换团。 她就那樣靜靜地躺著悉稠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪艘包。 梳的紋絲不亂的頭發(fā)上的猛,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音想虎,去河邊找鬼衰絮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛磷醋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胡诗,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼邓线,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼淌友!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起骇陈,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤震庭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后你雌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體器联,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年婿崭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拨拓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氓栈,死狀恐怖渣磷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情授瘦,我是刑警寧澤醋界,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站提完,受9級(jí)特大地震影響形纺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜徒欣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一逐样、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帚称,春花似錦官研、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至楼吃,卻和暖如春始花,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孩锡。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國打工酷宵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躬窜。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓浇垦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荣挨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子男韧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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