Android 內存優化之二 - MAT使用進階

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

系列文章

  1. Android 內存優化 (1) - MAT 使用入門
  2. Android 內存優化之二 - MAT使用進階
  3. Android 內存優化之三 - 打開 MAT 中的 Bitmap 原圖

Java的內存泄露

  • Java中的內存泄露主要特征:可達,無用
  • 無用指的是創建了但是不再使用之后沒有釋放
  • 能重用但是卻創建了新的對象進行處理

MAT使用技巧

使用Android Studio Dump內存文件

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

Android-Studio

然后選擇文件,點擊右鍵轉換成標準的hprof文件,就可以在MAT中打開了。

在使用使用Eclipse或者AndroidStudio抓內存之前,一定要手動點擊 Initiate GC按鈕手動觸發GC,這樣抓到的內存使用情況就是不包括Unreachable對象的。

手動觸發GC

Unreachable對象

Unreachable指的是可以被垃圾回收器回收的對象,但是由于沒有GC發生,所以沒有釋放,這時抓的內存使用中的Unreachable就是這些對象。

Unreachable Objects
Unreachable Objects Histogram

點擊Calculate Retained Size之后,會出現Retained Size這一列

Calculate Retained Size
Unreachable Objects Histogram

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

Histogram

MAT中Histogram的主要作用是查看一個instance的數量,一般用來查看自己創建的類的實例的個數。

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

通過查看Object的個數,結合代碼就可以找出存在內存泄露的類(即可達但是無用的對象,或者是可以重用但是重新創建的對象

Histogram中還可以對對象進行Group,更方便查看自己Package中的對象信息。


Paste_Image.png

Thread信息

MAT中可以查看當前的Thread信息:


Thread

從圖中可以得到的信息:

  1. 可以看到可能有內存問題的Thread:
內存異常
  1. 可以看到數量可能有問題的Thread
數量異常

幫助信息

MAT中的各個視圖中,在每一個Item中點擊右鍵會出現很多選項,很多時候我們需要依賴這些選項來進行分析:

右鍵選項

這些選項的具體含義則可以通過右鍵中的Search Queries這個選項(上圖中的倒數第四個選項)進行搜索和查看,非常的有用。

幫助信息

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

比如我們最常用的:

  • List objects -> with incoming references:查看這個對象持有的外部對象引用
  • List objects -> with outcoming references:查看這個對象被哪些外部對象引用
  • Path To GC Roots -> exclude all phantim/weak/soft etc. references:查看這個對象的GC Root,不包含虛、弱引用、軟引用,剩下的就是強引用。從GC上說,除了強引用外,其他的引用在JVM需要的情況下是都可以 被GC掉的,如果一個對象始終無法被GC,就是因為強引用的存在,從而導致在GC的過程中一直得不到回收,因此就內存溢出了。
  • Path To GC Roots -> exclude weak/soft references:查看這個對象的GC Root,不含弱引用和軟引用所有的引用.
  • Merge Shortest path to GC root:找到從GC根節點到一個對象或一組對象的共同路徑

Debug Bitmap

如果經常使用MAT分析內存,就會發現Bitmap所占用的內存是非常大的,這個和其實際顯示面積是有關系的。在2K屏幕上,一張Bitmap能達到20MB的大小。

所以要是MAT提供了一種方法,可以將存儲Bitmap的byte數組導出來,使用第三方工具打開。這個大大提高了我們分析內存泄露的效率。

關于這個方法的操作流程,可以參考這篇文章 還原MAT中的Bitmap圖像.

Debug ArrayList

ArrayList是使用非常常用的一個數據結構,在MAT中,如果想知道ArrayList中有哪些數據,需要右鍵-> List Objects -> With outgoing references,然后可以看到下面的圖:

Outgoing

從上圖可以看到,這個ArrayList的內容在一個array數組中,即暴漏了ArrayList的內部結構,查看的時候有點不方便,所以MAT提供了另外一種查看ArrayList內數據的方式:

Extrace List Values

其結果非常直觀:

Extrace List Values Result

Big Drops In Dominator Tree

Big Drops In Dominator Tree選項在右鍵->

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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容