Android 效能測試——Heap Viewer 工具
Heap Viewer能做什麼?
- 實時檢視App分配的記憶體大小和空閒記憶體大小
- 發現Memory Leaks
Heap Viewer使用條件
- 5.0以上的系統,包括5.0
- 開發者選項可用
Heap Viewer啟動
可以直接在Android studio工具欄中直接點選小機器人啟動:
還可以在Android studio的選單欄中Tools也可以:
如果你不用Android studio,可以在SDK下的tools下的monitor程式開啟:
Heap Viewer皮膚
按上圖的標記順序按下,我們就能看到記憶體的具體資料,右邊皮膚中數值會在每次GC時發生改變,包括App自動觸發或者你來手動觸發。
ok,現在來解釋下皮膚中的名詞
總覽
列名 | 意義 |
---|---|
Heap Size | 堆疊分配給App的記憶體大小 |
Allocated | 已分配使用的記憶體大小 |
Free | 空閒的記憶體大小 |
%Used | Allocated/Heap Size,使用率 |
Objects | 物件數量 |
詳情
型別 | 意義 |
---|---|
free | 空閒的物件 |
data object | 資料物件,類型別物件,最主要的觀察物件 |
class object | 類型別的引用物件 |
1-byte array(byte[],boolean[]) | 一個位元組的陣列物件 |
2-byte array(short[],char[]) | 兩個位元組的陣列物件 |
4-byte array(long[],double[]) | 4個位元組的陣列物件 |
non-Java object | 非Java物件 |
下面是每一個物件都有的列名含義:
列名 | 意義 |
---|---|
Count | 數量 |
Total Size | 總共佔用的記憶體大小 |
Smallest | 將物件佔用記憶體的大小從小往大排,排在第一個的物件佔用記憶體大小 |
Largest | 將物件佔用記憶體的大小從小往大排,排在最後一個的物件佔用的記憶體大小 |
Median | 將物件佔用記憶體的大小從小往大排,拍在中間的物件佔用的記憶體大小 |
Average | 平均值 |
當我們點選某一行時,可以看到如下的柱狀圖:
橫座標是物件的記憶體大小,這些值隨著不同物件是不同的,縱座標是在某個記憶體大小上的物件的數量
Heap Viewer的使用
我們說Heap Viewer適合發現記憶體洩漏的問題,那你知道何為記憶體洩漏麼?
記憶體洩漏
英文名:Memory Leaks
標準解釋:無用的單純,但是還是沒GC ROOT引用的記憶體
通俗解釋:該死不死的記憶體
檢測
那麼如何檢測呢?Heap Viewer中的數值會自動在每次發生GC時會自動更新,那麼我們是等著他自己GC麼?小弟不才,剛開始我就是這麼一直等啊等,由於GC的時機是系統把握的,所以很不好把握,既然我們是來看記憶體洩漏,那麼我們在需要檢測記憶體洩漏的用例執行過後,手動GC下,然後觀察data object
一欄的total size
(也可以觀察Heap Size/Allocated記憶體的情況),看看記憶體是不是會回到一個穩定值,多次操作後,只要記憶體是穩定在某個值,那麼說明沒有記憶體溢位的,如果發現記憶體在每次GC後,都在增長,不管是慢增長還是快速增長,都說明有記憶體洩漏的可能性。
例項
先來看3個圖:
1.剛開啟首頁,手動GC一下:
2.首頁到詳情頁10遍,最後回到首頁,手動GC一下,直到數值不再變化:
3.首頁到詳情頁10遍,最後回到首頁,手動GC一下:
從data object
一欄看到該型別的數值會在不斷增長,可能發生了記憶體洩漏,而我們也可以從上面三個圖的標紅部分來看,Allocated分別增加了2.418M
和1.084M
,而且你繼續這麼操作下去,記憶體依然是增長的趨勢
補充
Heap Viewer不光可以用來檢測是否有記憶體洩漏,對於記憶體抖動,我們也可以用該工具檢測,因為記憶體抖動的時候,會頻繁發生GC,這個時候我們只需要開啟Heap Viewer,觀察資料的變化,如果發生記憶體抖動,會觀察到資料在段時間內頻繁更新。