天天看點

MAT使用(Memory Analyzer Tool)堆記憶體分析

MAT使用

下載下傳:http://eclipse.org/mat/downloads.php

MAT工具全稱為Memory Analyzer Tool,一款詳細分析Java堆記憶體的工具,該工具非常強大,為了使用該工具,我們需要hprof檔案。但是該檔案不能直接被MAT使用,需要進行一步轉化,可以使用hprof-conv指令來轉化,但是Android Studio可以直接轉化,轉化方法如下:

1.選擇一個hprof檔案,點選右鍵選擇Export to standard .hprof選項。

MAT使用(Memory Analyzer Tool)堆記憶體分析

2.填寫更改後的檔案名和路徑:

MAT使用(Memory Analyzer Tool)堆記憶體分析

點選OK按鈕後,MAT工具所需的檔案就生成了,下面我們用MAT來打開該工具:

1.打開MAT後選擇File->Open File選擇我們剛才生成的doctorq.hprof檔案

MAT使用(Memory Analyzer Tool)堆記憶體分析

2.選擇該檔案後,MAT會有幾秒種的時間解析該檔案,有的hprof檔案可能過大,會有更長的時間解析,解析後,展現在我們的面前的界面如下:

MAT使用(Memory Analyzer Tool)堆記憶體分析

這是個總覽界面,會大體給出一些分析後初步的結論

Overview視圖

該視圖會首頁總結出目前這個Heap dump占用了多大的記憶體,其中涉及的類有多少,對象有多少,類加載器,如果有沒有回收的對象,會有一個連接配接,可以直接參看(圖中的Unreachable Objects Histogram)。

比如該例子中顯示了Heap dump占用了41M的記憶體,5400個類,96700個對象,6個類加載器。

然後還會有各種分類資訊:

Biggest Objects by Retained Size

會列舉出Retained Size值最大的幾個值,你可以将滑鼠放到餅圖中的扇葉上,可以在右側看出詳細資訊:

MAT使用(Memory Analyzer Tool)堆記憶體分析

圖中灰色區域,并不是我們需要關心的,他是除了大記憶體對象外的其他對象,我們需要關心的就是圖中彩色區域,比如圖中2.4M的對象,我們來看看該對象到底是啥:

MAT使用(Memory Analyzer Tool)堆記憶體分析

該對象是一個Bitmap對象,你如果想知道該對象到底是什麼圖檔,可以使用圖檔工具gimp工具浏覽該對象.

histogram視圖

histogram視圖主要是檢視某個類的執行個體個數,比如我們在檢查記憶體洩漏時候,要判斷是否頻繁建立了對象,就可以來看對象的個數來看。也可以通過排序看出占用記憶體大的對象:

MAT使用(Memory Analyzer Tool)堆記憶體分析

預設是類名形式展示,你也可以選擇不同的顯示方式,有以下四種方式:

MAT使用(Memory Analyzer Tool)堆記憶體分析

下面來示範一下:

MAT使用(Memory Analyzer Tool)堆記憶體分析

Dominator tree視圖

MAT使用(Memory Analyzer Tool)堆記憶體分析

該視圖會以占用總記憶體的百分比來列舉所有執行個體對象,注意這個地方是對象而不是類了,這個視圖是用來發現大記憶體對象的。這些對象都可以展開檢視更詳細的資訊,可以看到該對象内部包含的對象:

MAT使用(Memory Analyzer Tool)堆記憶體分析

Leaks suspects視圖

MAT使用(Memory Analyzer Tool)堆記憶體分析
MAT使用(Memory Analyzer Tool)堆記憶體分析

這個視圖會展示一些可能的記憶體洩漏的點,比如上圖上圖顯示有3個記憶體洩漏可疑點,我們以Problem Suspect 1為例來了解該報告,首先我們來看該可疑點詳細資訊:

MAT使用(Memory Analyzer Tool)堆記憶體分析

上面資訊顯示ImageCahe類的一個執行個體0xa50819f8占用了14.19%的記憶體,具體值為5147200位元組(5147200/1024/1024=4.9M),并存放在LinkedHashMap這個集合中,然後我們點選Details跳轉到更詳細的頁面:

MAT使用(Memory Analyzer Tool)堆記憶體分析

這樣我們就能找到在我們的app源碼中造成該洩漏可疑點的地方,很容易去定位問題.

代碼示例:https://download.csdn.net/download/wdx_1136346879/10912701

繼續閱讀