1 Memory Profile 簡介
Memory Profiler 是 Android Profiler 中的一個組件,它可以幫助你識別記憶體泄漏和記憶體溢位,從而導致存根、凍結甚至應用程式崩潰,它顯示了應用程式記憶體使用的實時圖,讓你捕獲堆轉儲、強制垃圾收集和跟蹤記憶體分配,
2 Memory Profile 啟動
如需打開 Memory Profile,請按以下步驟操作:
-
依次點擊 View > Tool Windows > Profiler,也可以點擊工具列中的 Profile 圖示,

-
從 Android Profiler 工具列中選擇要分析的設備和應用行程,如果已通過 USB 連接設備但系統未列出該設備,請確保已啟用 USB 除錯,
-
點擊 MEMORY 時間軸上的任意位置以打開記憶體性能分析器,

如圖所示,記憶體性能分析器的默認視圖包括以下各項:
- 用于強制執行垃圾回收事件的按鈕,
- 用于捕獲堆轉儲的按鈕,注意:只有在連接到搭載 Android 7.1(API 級別 25)或更低版本的設備時,系統才會在堆轉儲按鈕右側顯示用于記錄記憶體分配情況的按鈕,
- 用于指定性能分析器多久捕獲一次記憶體分配的下拉選單,選擇適當的選項可幫助你在進行性能剖析時提高應用性能,
- 用于縮放時間軸的按鈕,
- 用于跳轉到實時記憶體資料的按鈕,
- 事件時間軸,顯示活動狀態、用戶輸入事件和螢屏旋轉事件,
- 記憶體使用量時間軸,會顯示以下內容:
- 一個堆疊圖表,顯示每個記憶體類別當前使用多少記憶體,如左側的 y 軸以及頂部的彩色鍵所示,
- 一條虛線,表示分配的物件數,如右側的 y 軸所示,
- 每個垃圾回收事件的圖示,
但是,如果使用的是搭載 Android 7.1 或更低版本的設備,并非所有分析資料在默認情況下都可見,如果提示“Advanced profiling is unavailable for the selected process”,需要啟用高級性能剖析才能看到以下內容:
- 事件時間軸
- 分配的物件數
- 垃圾回收事件
在 Android 8.0 及更高版本上,系統會一律為可除錯的應用啟用高級性能剖析,
記憶體占用中的類別如下:
- Java:從 Java 或 Kotlin 代碼分配的物件的記憶體,
- Native:從 C 或 C++ 代碼分配的物件的記憶體,即使應用中不使用 C++,也可能會看到此處使用了一些原生記憶體,因為即使撰寫的代碼采用 Java 或 Kotlin 語言,Android 框架仍使用原生記憶體代表處理各種任務,如處理影像資源和其他圖形,
- Graphics:圖形緩沖區佇列為向螢屏顯示像素(包括 GL 表面、GL 紋理等等)所使用的記憶體,(請注意,這是與 CPU 共享的記憶體,不是 GPU 專用記憶體,)
- Stack:應用中的原生堆疊和 Java 堆疊使用的記憶體,這通常與應用運行多少執行緒有關,
- Code:應用用于處理代碼和資源(如 dex 位元組碼、經過優化或編譯的 dex 代碼、.so 庫和字體)的記憶體,
- Others:應用使用的系統不確定如何分類的記憶體,
- Allocated:應用分配的 Java/Kotlin 物件數,此數字沒有計入 C 或 C++ 中分配的物件,如果連接到搭載 Android 7.1 及更低版本的設備,只有在 Memory Profile 連接到運行的應用時,才開始此分配計數,因此,開始分析之前分配的任何物件都不會被計入,但是,Android 8.0 及更高版本附帶一個設備內置性能剖析工具,該工具可跟蹤所有分配,因此,在 Android 8.0 及更高版本上,此數字始終表示應用中待處理的 Java 物件總數,
與以前的 Android Monitor 工具中的記憶體占用相比,新的 Memory Profile 以不同的方式記錄記憶體占用,因此記憶體使用量現在看上去可能會更高些,Memory Profile 會監控一些額外的類別,這就增加了總的記憶體使用量,但“Java”占用與以前工具中的數值相似,
3 查看記憶體分配情況
記憶體分配情況圖表顯示記憶體中每個 Java 物件和 JNI 參考的分配方式,具體而言,Memory Profile 顯示有關物件分配情況的以下資訊:
- 分配了哪些型別的物件以及它們使用多少空間,
- 每個分配的堆疊軌跡,包括在哪個執行緒中,
- 物件在何時被取消分配(僅當使用搭載 Android 8.0 或更高版本的設備時),
如果設備搭載的是 Android 8.0 或更高版本,可以隨時查看物件分配,具體操作步驟如下:在時間軸上拖動以選擇要查看哪個區域的分配,不需要開始記錄會話,因為 Android 8.0 及更高版本附帶設備內置分析工具,可持續跟蹤您的應用分配,如圖所示:

如果設備搭載的是 Android 7.1 或更低版本,請點擊記憶體性能分析器工具列中的 Record 按鈕 ,記錄時,記憶體性能分析器會跟蹤應用中發生的所有分配,完成后,再次點擊按鈕以查看分配,

如需檢查分配記錄,請按以下步驟操作:
- 瀏覽串列以查找堆計數例外大且可能存在泄漏的物件,為幫助查找已知類,點擊 Class Name 列標題以按字母順序排序,然后,點擊一個類名稱,此時右側將出現 Instance View 窗格,顯示該類的每個實體,
此外,您也可以快速找到物件,方法是點擊 Filter 圖示
,或按 Ctrl+F 鍵(在 Mac 上,按 Command+F 鍵),然后在搜索欄位中輸入類或軟體包名稱,如果從下拉選單中選擇 Arrange by callstack,還可以按方法名稱搜索,如需使用正則運算式,請勾選 Regex 旁邊的復選框,如果您的搜索查詢區分大小寫,請勾選 Match case 旁邊的復選框, - 在 Instance View 窗格中,點擊一個實體,此時下方將出現 Call Stack 標簽頁,顯示該實體被分配到何處以及在哪個執行緒中,
- 在 Call Stack 標簽頁中,右鍵點擊任意行并選擇 Jump to Source,以在編輯器中打開該代碼,

在已分配物件串列上方有兩個下拉選單,
從左側的選單中,選擇需檢查的堆:
- default heap:當系統未指定堆時,
- image heap:系統啟動映像,包含啟動期間預加載的類,
- zygote heap:寫時復制堆,其中的應用行程是從 Android 系統中派生的,
- app heap:應用在其中分配記憶體的主堆,
- JNI heap:顯示 Java 原生介面 (JNI) 參考被分配和釋放到什么位置的堆,
從右側的選單中,選擇如何安排分配:
- Arrange by class:根據類名稱對所有分配進行分組,這是默認值,
- Arrange by package:根據軟體包名稱對所有分配進行分組,
- Arrange by callstack:將所有分配分組到其對應的呼叫堆疊,
如果需要查看 Native 層的記憶體分配,左側選單選擇 JNI heap,而且應用需要部署到搭載 Android 8.0 或更高版本的設備上,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/297327.html
標籤:其他
