引言
欲善其事, 先利其器, 今天來聊聊那些記憶體分析工具.
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複製程式碼
輸出資訊如下:
該命令常用來檢視當前程式的的記憶體使用狀態, 是一個總體的預覽.
結語
正所謂善其事先利其器, 瞭解了記憶體分析工具的使用, 我們才能更好的分析記憶體問題, 從而得出解決方案或是明白從哪些方面去避免記憶體問題.
下一篇將以程式碼例項形式來說明上面這些工具的具體使用, 敬請期待.
轉載請註明出處, 歡迎大家分享到朋友圈, 微博~