Android Profile--Memory Monitor
簡介
在Android Studio3.0 Preview版本中,Android Profiler中提供了Memory Monitor工具來監控選中App記憶體變化,可以方便的追蹤記憶體回收以及定位記憶體洩露,追蹤記憶體分配,呈現出當前記憶體的分配與使用情況。
該工具可以幫我們完成以下事情:
- 通過圖形的方式展示當前已使用記憶體、剩餘記憶體情況
- 隨著時間變化,展示GC事件
- 初始化GC事件
- 快速測試是否當前App使用慢是因為GC事件引起
- 快速測試App Crash是否因為OOM
工具截圖
點選MemoryMonitor後進入記憶體使用詳情視窗,如下圖所示
記憶體優化步驟
- 使用Memory Monitor檢視是否是因為有不期望的GC事件導致效能問題
- 如果發現了在短時間內有大量的GC事件的話,通過Dump記憶體確定是哪種型別的物件持續在分配記憶體,觀察是否該記憶體是必須分配的
- 啟動AllocationTracker來查詢在程式碼中出現的問題
Java Heap資料實時的展示了你的App分配的記憶體型別,個數,以及在Heap中佔用大小。檢視Heap可以幫助我們發現:
- App分配和釋放的記憶體
- 識別記憶體洩露
- Allocation Tracker記錄了App記憶體分配並且將所有在這一次Profile週期中的記憶體列出來,包括方法呼叫棧,大小,以及正在分配記憶體的程式碼。
這樣就能識別出來是否有在短時間內進行分配和釋放的記憶體,檢視完後就可以根據程式碼進行記憶體使用的優化
HeapDump結果可以根據App包名、類名等來進行分類展示,點選後可以在右側視窗看對應型別例項物件
Allocation Tracker也會在列出在某段時間內的記憶體分配型別以及物件大小等
GC Root以及Dominator Tree
當Dump出來Java Heap之後,可以到處一個Android特有的Hprof檔案,可以使用Hprof Viewer來進行檢視此類檔案,並且在這個工具中會有一個Dominator Tree的圖示,來標誌GC Root(Depth為0)。
以下為在Java中常見的為GC Root的型別:
- JNI物件以及記憶體
- 棧中的引用
- Static的方法以及變數
- 可以被引用到的執行緒和物件
- 被BootStrap Loader載入的類
- 被鎖住的物件
在不同的虛擬機器版本中,記憶體管理機制也不一樣:
- Android 4.3(API 18)以及4.3版本以下的虛擬機器使用Dalvik
- Android 4.4(API 19)預設虛擬機器為Dalvik,ART為可選項
- 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
相關文章
- 解決在Android Studio 3.2找不到Android Device Monitor工具Androiddev
- 2788647047_monitor
- Android記憶體優化(四)解析Memory Monitor、Allocation Tracker和Heap DumpAndroid記憶體優化
- Postman的Monitor功能Postman
- Verilog 監控 Monitor
- Azure Monitor(二)Log Analytics
- synchronized的monitor監視器synchronized
- Oracle 效能調優工具:SQL MonitorOracleSQL
- plsql developer工具生成sql monitor reportSQLDeveloper
- 使用sql monitor獲取更加詳細的執行計劃 - dbms_sqltune.report_sql_monitorSQL
- [20190306]11g health monitor.txt
- 網速監控軟體 Traffic Monitor
- ceph儲存的monitor選舉流程
- 【翻譯】.NET 6 中的 dotnet monitor
- Guava併發:使用Monitor控制併發Guava
- Java併發(十九)----Monitor原理及Synchronized原理Javasynchronized
- Oracle SQL調優系列之SQL Monitor ReportOracleSQL
- 管程(Monitor)概念及Java的實現原理Java
- 通過redis的monitor命令排除故障Redis
- mysql的三個sql的monitor選項MySql
- MySQL 5.6 遭遇 OS bug INNODB MONITOR OUTPUT 事件MySql事件
- 使用 dotnet-monitor 分析.NET 應用程式
- 基礎才是重中之重~lock和monitor的區別
- Monitor Ctrl-Break執行緒,有點坑執行緒
- 什麼是 Web 應用程式的 synthetic monitorWeb
- 【CURSOR】How to Monitor and tune Open and Cached Cursors (Doc ID 1430255.1)
- Airpods Battery Monitor Mac(AirPods電池監控器)AIBATMac
- 深圳軟體測試培訓:Postman的Monitor功能Postman
- Monitor的擴充套件支援string的超時鎖套件
- 涉及到一個deadlock event monitor的問題
- [20200326]dbms_monitor跟蹤與SQL語句分析.txtSQL
- FastDFS 提供的監控工具 fdfs_monitor 使用指南AST
- Vite外掛開發紀實:vite-plugin-monitor(上)VitePlugin
- Vite外掛開發紀實:vite-plugin-monitor(下)VitePlugin
- 使用dbms_monitor.session_trace_enable跟蹤一個會話Session會話
- web server apache tomcat11-21-monitor and management 監控與管理WebServerApacheTomcat
- SOLIDWORKS PDM客戶端監控管理外掛SolidKits. MonitorSolid客戶端
- Using V$BACKUP_ASYNC_IO / V$BACKUP_SYNC_IO to Monitor RMAN PerformanceORM
- 當 dotnet-monitor 遇上 Prometheus, 是種什麼樣的體驗?Prometheus