Android 內(nèi)存優(yōu)化之二 - MAT使用進(jìn)階

本人博客地址:https://androidperformance.com
本文博客地址:https://androidperformance.com/2015/04/11/AndroidMemory-Usage-Of-MAT-Pro/

系列文章

  1. Android 內(nèi)存優(yōu)化 (1) - MAT 使用入門
  2. Android 內(nèi)存優(yōu)化之二 - MAT使用進(jìn)階
  3. Android 內(nèi)存優(yōu)化之三 - 打開(kāi) MAT 中的 Bitmap 原圖

Java的內(nèi)存泄露

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

MAT使用技巧

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

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

Android-Studio

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

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

手動(dòng)觸發(fā)GC

Unreachable對(duì)象

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

Unreachable Objects
Unreachable Objects Histogram

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

Calculate Retained Size
Unreachable Objects Histogram

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

Histogram

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

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

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

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


Paste_Image.png

Thread信息

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


Thread

從圖中可以得到的信息:

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

幫助信息

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

右鍵選項(xiàng)

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

幫助信息

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

比如我們最常用的:

  • 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上說(shuō),除了強(qiáng)引用外,其他的引用在JVM需要的情況下是都可以 被GC掉的,如果一個(gè)對(duì)象始終無(wú)法被GC,就是因?yàn)閺?qiáng)引用的存在,從而導(dǎo)致在GC的過(guò)程中一直得不到回收,因此就內(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)出來(lái),使用第三方工具打開(kāi)。這個(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,然后可以看到下面的圖:

Outgoing

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

Extrace List Values

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

Extrace List Values Result

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.

Big Drops In Dominator Tree
最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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