Android Profile--Memory Monitor

weixin_34075551發表於2017-08-26

簡介

在Android Studio3.0 Preview版本中,Android Profiler中提供了Memory Monitor工具來監控選中App記憶體變化,可以方便的追蹤記憶體回收以及定位記憶體洩露,追蹤記憶體分配,呈現出當前記憶體的分配與使用情況。

該工具可以幫我們完成以下事情:

  1. 通過圖形的方式展示當前已使用記憶體、剩餘記憶體情況
  2. 隨著時間變化,展示GC事件
  3. 初始化GC事件
  4. 快速測試是否當前App使用慢是因為GC事件引起
  5. 快速測試App Crash是否因為OOM

工具截圖

1941624-8c5cee6ac90a6ecc.png
Android Profiler中Memory Monitor

點選MemoryMonitor後進入記憶體使用詳情視窗,如下圖所示

1941624-ef14f6c6b64ed01f.png
Memory Detail

記憶體優化步驟

  1. 使用Memory Monitor檢視是否是因為有不期望的GC事件導致效能問題
  2. 如果發現了在短時間內有大量的GC事件的話,通過Dump記憶體確定是哪種型別的物件持續在分配記憶體,觀察是否該記憶體是必須分配的
  3. 啟動AllocationTracker來查詢在程式碼中出現的問題

Java Heap資料實時的展示了你的App分配的記憶體型別,個數,以及在Heap中佔用大小。檢視Heap可以幫助我們發現:

  1. App分配和釋放的記憶體
  2. 識別記憶體洩露
  3. Allocation Tracker記錄了App記憶體分配並且將所有在這一次Profile週期中的記憶體列出來,包括方法呼叫棧,大小,以及正在分配記憶體的程式碼。

這樣就能識別出來是否有在短時間內進行分配和釋放的記憶體,檢視完後就可以根據程式碼進行記憶體使用的優化

HeapDump結果可以根據App包名、類名等來進行分類展示,點選後可以在右側視窗看對應型別例項物件


1941624-816e688039315a36.png
HeapDump

Allocation Tracker也會在列出在某段時間內的記憶體分配型別以及物件大小等


1941624-426f260b57f57447.png
Allocation Tracker

GC Root以及Dominator Tree

當Dump出來Java Heap之後,可以到處一個Android特有的Hprof檔案,可以使用Hprof Viewer來進行檢視此類檔案,並且在這個工具中會有一個Dominator Tree的圖示,來標誌GC Root(Depth為0)。

以下為在Java中常見的為GC Root的型別:

  1. JNI物件以及記憶體
  2. 棧中的引用
  3. Static的方法以及變數
  4. 可以被引用到的執行緒和物件
  5. 被BootStrap Loader載入的類
  6. 被鎖住的物件

在不同的虛擬機器版本中,記憶體管理機制也不一樣:

  1. Android 4.3(API 18)以及4.3版本以下的虛擬機器使用Dalvik
  2. Android 4.4(API 19)預設虛擬機器為Dalvik,ART為可選項
  3. Android 5.0(API 21)以及5.0版本以上的虛擬機器使用ART

虛擬機器處理了GC,Dalvik虛擬機器使用mark-and-sweep方案來進行GC,而ART使用generational方案,並且當記憶體需要Full GC的時候聯合了mark-and-sweep方案進行回收,例如當記憶體變得極度碎片化的時候。
LogCat展示了一些GC的日誌,標誌著GC發生的時間以及原因。
MemoryMonitor的結果會根據虛擬機器的不同產生變化,而我們在測試記憶體的時候,需要同時測試ART以及Dalvik。
如何檢視RAM的使用請戳連結:調查 RAM 使用情況
Dalvik與ART的區別請戳連結:ART 和 Dalvik
AllocationTracker的使用請戳連結:Allocation Tracker

相關文章