引言
前兩彈:
GC那些事兒
Android內存管理
欲善其事, 先利其器, 今天來聊聊那些內存分析工具.
1, 一圖看懂Memory Monitor
Memory Monitor 是 Android Studio內置的, 官方的內存監測工具. 圖形化的展示當前應用的內存狀態, 包括已分配內存, 空閑內存, 內存實時動態等.
頂部矩形指示當前調試的設備以及應用進程.
-
圖形區域:
- 橫向時間軸, 內存檢測時間, 跟隨滾動.
- 縱向內存軸, 內存使用量, 根據應用使用動態分配.
- 藍色區域表示當前已分配使用的內存量.
- 灰色區域表示剩余可使用的內存量.
- 紅色圈圈指示的是系統GC事件(內存有一定量的回收).
-
工具欄:
- ① GC按鈕, 點擊執行一次GC操作.
- ② Dump Java Heap按鈕, 點擊會在該調試工程的captures目錄生成一個類似這樣"com.anly.githubapp_2016.09.21_23.42.hprof"命名的hprof文件, 并打開Android Studio的HPROF Viewer顯示該文件內容.
- ③ Allocation Traking按鈕, 點擊一次開始, 再次點擊結束, 同樣會在captrures目錄生成一個文件, 類似"com.anly.githubapp_2016.09.21_23.48.alloc", alloc后綴的文件, 并打開Allocation Tracker視圖展示該文件內容.
2, 使用HPROF Viewer & Analyzer來分析hprof文件
Memory Monitor通過Dump Java Heap可以生成一個hprof的文件, 這個文件是Android特定的Heap和CPU分析文件, 記錄了這段時間內的Java Heap變化.
2.1 關于Java Heap
由Java Heap文件可以看到如下數據:
- 按類型顯示對象申請的內存快照(內存大小);
- 每次自動或手動觸發GC時的樣本數據;
- 協助定位可能發生的內存泄露點:
- 所有已經被destroyed的activity, 還可以從GC Root訪問到.
- 重復的String實例.
2.2 HPROF Viewer怎么看
還是用圖說話:
HPROF Viewer分成三個大塊, 分別介紹下:
2.2.1 Class View
圖中標①的View.
顯示當前選中的Heap中的所有Class. 上方有兩個可選列表, 分別是用來選擇Heap區域, 和Class View的展示方式的.
Heap類型分為:
- App Heap -- 當前App使用的Heap
- Image Heap -- 磁盤上當前App的內存映射拷貝
- Zygote Heap -- Zygote進程Heap(每個App進程都是從Zygote孵化出來的, 這部分基本是framework中的通用的類的Heap)
可選展示方式:
- Class List View -- 類列表方式
- Package Tree View -- 根據包結構的樹狀顯示
列 | 解釋 |
---|---|
Class Name | 類名 |
Total Count | 該類的實例個數 |
Heap Count | 選定的Heap中該實例的個數 |
Sizeof | 每個該實例占用的內存大小 |
Shallow Size | 所有該類的實例占用的內存大小 |
Retained Size | 該類的所有實例可支配的內存大小 |
2.2.2 Instance View
圖中標②的View.
根據在Class View中選中的Class, 列表方式展示其所有實例的內存占用情況.
列 | 解釋 |
---|---|
Instance | 該類的實例 |
Depth | 深度, 從任一GC Root點到該實例的最短跳數 |
Dominating Size | 該實例可支配的內存大小 |
2.2.3 Reference Tree
圖中標③的View.
根據在Instance View中選中的實例, 顯示其引用關系樹.
此View中的列含義與Instance View一致.
在此View中可以右鍵點擊instance, 進入代碼:
2.3 HPROF Analyzer
另外, 在HPROF Viewer的右側有一個"Analyzer Tasks"的按鈕, 點擊會進入HPROF Analyzer的hprof的分析界面:
分析任務包括:
- 檢測泄露的Activity
- 查找重復的String實例
點擊開始按鈕后, 會在Analysis Results區域顯示分析結果.
HPROF Viewer & Analyzer 可以用來對App的運行中的Java Heap做一個整體分析, 展示當前內存的具體到類和實例的分配情況, 以便檢測到可能的內存泄露和重復實例.
3, Allocation Tracker
HPROF Viewer & Analyzer是整體的, 那么Allocation Tracker則是針對操作的分析.
Allocation Tracker可以協助我們分析在一個特定操作時, 有哪些對象被分配內存了. 這可以很方便的讓我們知道方法調用的情況, 以便針對性的優化, 以提升性能和內存使用.
在Android Studio的Memory Monitor中點擊"Start Allocation Tracking", 在device中執行一個要分析的操作, 然后再次點擊. 如下所示:
會生成一個alloc文件, 并打開:
可以按照兩種方式展示:
- Group by Method -- 按照線程方法分組顯示
- Group by Allocator -- 按照包分組顯示
Method視圖中的列含義如下:
列 | 解釋 |
---|---|
Method | 方法 |
Count | 該方法分配的實例總數 |
Size | 該方法分配的內存總量(byte) |
可以根據Count和Size分別排序, 找出產生實例多, 耗費內存多的方法, 結合代碼分析, 以提升其性能.
4, MAT
Eclipse MAT是一個快速且功能豐富的Java Heap分析工具, 可以幫助我們尋找內存泄露, 減少內存消耗.
MAT可以分析程序(成千上萬的對象產生過程中)生成的Heap dumps文件, 它會快速計算出對象的Retained Size, 來展示是哪些對象沒有被GC, 自動生成內存泄露疑點的報告.
具體MAT的使用請移步鄙人翻譯整理的MAT的使用手冊
5, LeakCanary
LeakCanary是大名鼎鼎的square出的一款開源的用來做內存泄露檢測的工具.
具體植入方式, 請參考LeakCanary README文檔, 略過.
App植入LeakCanary之后, 在檢測可能的內存泄露后, 會彈出Toast提示:
并在測試手機桌面生成一個Leaks的icon:
點擊該icon進入Leaks界面, 可以比較清晰的看到內存泄露疑點:
6, adb shell dumpsys
在之前的一篇關于ADB使用的文中有聊到adb shell dumpsys命令, 該命令可以用戶輸出當前的系統狀態信息.
其中就有關于內存的選項:
$ adb shell dumpsys meminfo com.udinic.perfdemo
輸出信息如下:
該命令常用來查看當前進程的的內存使用狀態, 是一個總體的預覽.
結語
正所謂善其事先利其器, 了解了內存分析工具的使用, 我們才能更好的分析內存問題, 從而得出解決方案或是明白從哪些方面去避免內存問題.
下一篇將以代碼實例形式來說明上面這些工具的具體使用, 敬請期待.
轉載請注明出處, 歡迎大家分享到朋友圈, 微博~