Tools, 出來接活了--Android記憶體優化第三彈

anly_jun發表於2016-10-25

引言

前兩彈:
GC那些事兒
Android記憶體管理

欲善其事, 先利其器, 今天來聊聊那些記憶體分析工具.

1, 一圖看懂Memory Monitor

Memory Monitor 是 Android Studio內建的, 官方的記憶體監測工具. 圖形化的展示當前應用的記憶體狀態, 包括已分配記憶體, 空閒記憶體, 記憶體實時動態等.

Tools, 出來接活了--Android記憶體優化第三彈

  • 頂部矩形指示當前除錯的裝置以及應用程式.

  • 圖形區域:

    • 橫向時間軸, 記憶體檢測時間, 跟隨滾動.
    • 縱向記憶體軸, 記憶體使用量, 根據應用使用動態分配.
    • 藍色區域表示當前已分配使用的記憶體量.
    • 灰色區域表示剩餘可使用的記憶體量.
    • 紅色圈圈指示的是系統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怎麼看

還是用圖說話:

Tools, 出來接活了--Android記憶體優化第三彈
-w1200

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, 進入程式碼:

Tools, 出來接活了--Android記憶體優化第三彈

2.3 HPROF Analyzer

另外, 在HPROF Viewer的右側有一個"Analyzer Tasks"的按鈕, 點選會進入HPROF Analyzer的hprof的分析介面:

Tools, 出來接活了--Android記憶體優化第三彈

分析任務包括:

  • 檢測洩露的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中執行一個要分析的操作, 然後再次點選. 如下所示:

Tools, 出來接活了--Android記憶體優化第三彈

會生成一個alloc檔案, 並開啟:

Tools, 出來接活了--Android記憶體優化第三彈

可以按照兩種方式展示:

  • 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提示:

Tools, 出來接活了--Android記憶體優化第三彈

並在測試手機桌面生成一個Leaks的icon:

Tools, 出來接活了--Android記憶體優化第三彈

點選該icon進入Leaks介面, 可以比較清晰的看到記憶體洩露疑點:

6, adb shell dumpsys

在之前的一篇關於ADB使用的文中有聊到adb shell dumpsys命令, 該命令可以使用者輸出當前的系統狀態資訊.

其中就有關於記憶體的選項:

$ adb shell dumpsys meminfo com.udinic.perfdemo複製程式碼

輸出資訊如下:

Tools, 出來接活了--Android記憶體優化第三彈
Snip20161025_19

該命令常用來檢視當前程式的的記憶體使用狀態, 是一個總體的預覽.

結語

正所謂善其事先利其器, 瞭解了記憶體分析工具的使用, 我們才能更好的分析記憶體問題, 從而得出解決方案或是明白從哪些方面去避免記憶體問題.

下一篇將以程式碼例項形式來說明上面這些工具的具體使用, 敬請期待.


轉載請註明出處, 歡迎大家分享到朋友圈, 微博~

相關文章