> 參考文章:[Heap Viewer](https://developer.android.com/intl/zh-cn/tools/performance/heap-viewer/index.html)?
> [Android 內存監測工具 DDMS –> Heap?](http://blog.csdn.net/feng88724/article/details/6460918)
> [使用DDMS中的內存監測工具Heap來優化內存](http://www.cnblogs.com/tianzhijiexian/p/4267919.html)
# 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,觀察數據的變化,如果發生內存抖動,會觀察到數據在段時間內頻繁更新。