前兩彈:
GC那些事兒
Android內存管理java
欲善其事, 先利其器, 今天來聊聊那些內存分析工具.git
Memory Monitor 是 Android Studio內置的, 官方的內存監測工具. 圖形化的展現當前應用的內存狀態, 包括已分配內存, 空閒內存, 內存實時動態等.github
頂部矩形指示當前調試的設備以及應用進程.shell
圖形區域:app
工具欄:eclipse
Memory Monitor經過Dump Java Heap能夠生成一個hprof的文件, 這個文件是Android特定的Heap和CPU分析文件, 記錄了這段時間內的Java Heap變化.工具
由Java Heap文件能夠看到以下數據:post
仍是用圖說話:
性能
HPROF Viewer分紅三個大塊, 分別介紹下:測試
圖中標①的View.
顯示當前選中的Heap中的全部Class. 上方有兩個可選列表, 分別是用來選擇Heap區域, 和Class View的展現方式的.
Heap類型分爲:
可選展現方式:
列 | 解釋 |
---|---|
Class Name | 類名 |
Total Count | 該類的實例個數 |
Heap Count | 選定的Heap中該實例的個數 |
Sizeof | 每一個該實例佔用的內存大小 |
Shallow Size | 全部該類的實例佔用的內存大小 |
Retained Size | 該類的全部實例可支配的內存大小 |
圖中標②的View.
根據在Class View中選中的Class, 列表方式展現其全部實例的內存佔用狀況.
列 | 解釋 |
---|---|
Instance | 該類的實例 |
Depth | 深度, 從任一GC Root點到該實例的最短跳數 |
Dominating Size | 該實例可支配的內存大小 |
圖中標③的View.
根據在Instance View中選中的實例, 顯示其引用關係樹.
此View中的列含義與Instance View一致.
在此View中能夠右鍵點擊instance, 進入代碼:
另外, 在HPROF Viewer的右側有一個"Analyzer Tasks"的按鈕, 點擊會進入HPROF Analyzer的hprof的分析界面:
分析任務包括:
點擊開始按鈕後, 會在Analysis Results區域顯示分析結果.
HPROF Viewer & Analyzer 能夠用來對App的運行中的Java Heap作一個總體分析, 展現當前內存的具體到類和實例的分配狀況, 以便檢測到可能的內存泄露和重複實例.
HPROF Viewer & Analyzer是總體的, 那麼Allocation Tracker則是針對操做的分析.
Allocation Tracker能夠協助咱們分析在一個特定操做時, 有哪些對象被分配內存了. 這能夠很方便的讓咱們知道方法調用的狀況, 以便針對性的優化, 以提高性能和內存使用.
在Android Studio的Memory Monitor中點擊"Start Allocation Tracking", 在device中執行一個要分析的操做, 而後再次點擊. 以下所示:
會生成一個alloc文件, 並打開:
能夠按照兩種方式展現:
Method視圖中的列含義以下:
列 | 解釋 |
---|---|
Method | 方法 |
Count | 該方法分配的實例總數 |
Size | 該方法分配的內存總量(byte) |
能夠根據Count和Size分別排序, 找出產生實例多, 耗費內存多的方法, 結合代碼分析, 以提高其性能.
Eclipse MAT是一個快速且功能豐富的Java Heap分析工具, 能夠幫助咱們尋找內存泄露, 減小內存消耗.
MAT能夠分析程序(成千上萬的對象產生過程當中)生成的Heap dumps文件, 它會快速計算出對象的Retained Size, 來展現是哪些對象沒有被GC, 自動生成內存泄露疑點的報告.
具體MAT的使用請移步鄙人翻譯整理的MAT的使用手冊
LeakCanary是大名鼎鼎的square出的一款開源的用來作內存泄露檢測的工具.
具體植入方式, 請參考LeakCanary README文檔, 略過.
App植入LeakCanary以後, 在檢測可能的內存泄露後, 會彈出Toast提示:
並在測試手機桌面生成一個Leaks的icon:
點擊該icon進入Leaks界面, 能夠比較清晰的看到內存泄露疑點:
在以前的一篇關於ADB使用的文中有聊到adb shell dumpsys命令, 該命令能夠用戶輸出當前的系統狀態信息.
其中就有關於內存的選項:
$ adb shell dumpsys meminfo com.udinic.perfdemo複製代碼
輸出信息以下:
該命令經常使用來查看當前進程的的內存使用狀態, 是一個整體的預覽.
正所謂善其事先利其器, 瞭解了內存分析工具的使用, 咱們才能更好的分析內存問題, 從而得出解決方案或是明白從哪些方面去避免內存問題.
下一篇將以代碼實例形式來講明上面這些工具的具體使用, 敬請期待.
轉載請註明出處, 歡迎你們分享到朋友圈, 微博~