擷取記憶體快照資料

擷取記憶體快照資料,查看應用程式中哪些物件佔用過多記憶體 擷取時間並找出記憶體流失 (也就是記憶體配置行為) 可能導致延遲、沒有回應,甚至是應用程式當機。更棒的是 會在擴充使用者工作階段之後擷取記憶體快照資料,但其中可能仍顯示物件 表示不會再出現該位置

本頁說明 Android Studio 提供的工具,可用於收集及分析堆積傾印。此外,您也可以前往 搭配 dumpsys 的指令列,並參閱 Logcat 中的垃圾收集 (GC) 事件

為什麼您必須分析應用程式記憶體

Android 提供代管記憶體 環境—當 Android 判定 應用程式已不再使用部分物件,因此垃圾收集器會 未使用的記憶體回到堆積Android 如何尋找未使用的記憶體 我們會不斷改進 但在所有 Android 版本中 請務必暫停執行程式碼在多數情況下,使用者不容易察覺這類停頓。 不過,如果應用程式配置記憶體的速度比系統收集的速度更快 由於收集器釋出的記憶體足以滿足 分配負載延遲可能會導致應用程式略過影格,並造成 畫面顯示速度緩慢

即使應用程式執行速度沒有變慢,但如果發生記憶體流失情形,應用程式在背景中運作時仍會保留該記憶體。這個行為會強制執行不必要的垃圾收集事件,因而降低其餘的系統記憶體效能。系統最後會強制終止應用程式程序來回收記憶體。之後,當使用者返回應用程式時,應用程式程序就必須完全重新啟動。

如要進一步瞭解可減少應用程式記憶體用量的程式設計做法,請參閱「管理應用程式的記憶體」。

記憶體快照資料總覽

如要擷取記憶體快照資料, 選取「Analyze Memory Usage (Heap Dump)」工作 (使用 Profiler:執行「app」做為可進行偵錯 (完整資料)) 來擷取堆積 轉儲。傾印記憶體快照資料時,Java 記憶體的數量可能會增加 暫時停止。這是正常現象,因為記憶體快照資料會在與應用程式相同的程序中發生,因此需要一些記憶體來收集資料。拍照後 您會看到以下內容:

類別清單會顯示下列資訊:

  • Allocations:堆積中的配置數量。
  • Native Size:該物件類型使用的原生記憶體總量 (以位元組為單位)。您會在這裡看到使用 Java 配置的部分物件記憶體 Android 會為部分架構類別使用原生記憶體,例如 Bitmap

  • Shallow Size:該物件類型使用的 Java 記憶體總量 (以位元組為單位)。

  • Retained Size:該類別的所有執行個體所保留的記憶體總大小 (以位元組為單位)。

使用堆積選單篩選特定堆積:

  • 應用程式堆積 (預設):應用程式會在這個堆積上配置記憶體。
  • 映像檔堆積:系統開機映像檔,包含預先載入的類別 都必須先經過處理此處的配置永遠不會移動或消失。
  • Zygote heap:Android 系統中寫入時複製的堆積,應用程式的程序是從這個堆積分支而來。

使用排列方式下拉式選單選擇分配的排列方式:

  • Arrange by class (預設):根據類別名稱將所有配置分組。
  • Arrange by package:根據套件名稱將所有配置分組。

請使用課程下拉式選單篩選課程群組:

  • 所有類別 (預設):顯示所有類別,包括來自程式庫和依附元件的類別。
  • 顯示活動/片段流失:顯示導致記憶體流失的類別。
  • 顯示專案類別:僅顯示專案定義的類別。

按一下類別名稱,開啟「Instance」(執行個體) 窗格。這裡列出的每個執行個體包括 包括:

  • Depth:從任何 GC 根目錄到所選執行個體的最短躍點。
  • Native Size:原生記憶體中該執行個體的大小。只有 Android 7.0 以上版本才會顯示這個資料欄。
  • Shallow Size:Java 記憶體中該執行個體的大小。
  • Retained Size:該執行個體支配的記憶體大小 (請參閱「支配樹狀圖」)。

按一下要檢查的執行個體,即可顯示「Instance Details」(執行個體詳細資料),包括其「Fields」(欄位)和「References」(參照)。常見的欄位和參照類型是 Java 中的結構化類型 、陣列 和原始資料類型 。在欄位或參照上按一下滑鼠右鍵,即可前往相關聯的執行個體,或是 程式碼。

  • 欄位:顯示該項目中的所有欄位。
  • 參考資料:顯示 「執行個體」分頁。

找出記憶體流失問題

如要快速篩選可能與記憶體流失相關的類別,請開啟 選取類別下拉式選單,然後選取「Show activity/Fragment leaks」。Android Studio 會顯示出其認為代表記憶體流失的類別 Activity 和 應用程式中的 Fragment 例項。類型 此篩選器顯示的資料包括:

  • 已遭刪除但仍受參照的 Activity 執行個體。
  • 不含有效 FragmentManager 但仍受參照的 Fragment 執行個體。

請注意,這個篩選器可能會在下列內容中產生偽陽性 情境:

  • Fragment 已建立但尚未使用。
  • Fragment 已快取,但不屬於 FragmentTransaction

如要手動查看記憶體流失情形,請瀏覽類別和例項清單,找出「Retained Size」過大的物件。請注意下列任一原因所導致的記憶體流失情形:

  • 長時間參照 ActivityContextViewDrawable 以及可能會保留 ActivityContext 容器參照的其他物件。
  • 非靜態內部類別,例如 Runnable,可包含 Activity 執行個體。
  • 保留物件超過必要時間的快取。

找出潛在記憶體流失問題時,請使用「欄位」和「參考資料」分頁 在「執行個體詳細資料」中,跳至所需的執行個體或原始碼行。

觸發測試用記憶體流失問題

如要分析記憶體用量,請對應用程式程式碼施加壓力,並嘗試強制發生記憶體流失問題。如果想在應用程式中引發記憶體流失,其中一種方法是讓應用程式執行一段時間 再開始檢查堆積記憶體流失情形可能會逐漸蔓延至堆積中的配置頂部。不過,流失情形越少,就需要更長的應用程式執行時間,以便觀察流失情形。

您也可以透過下列任一方式觸發記憶體流失:

  • 在不同的活動狀態下,將裝置從直向轉為橫向再轉回直向,依此多次反覆執行。旋轉裝置經常會導致應用程式的 ActivityContextView 物件流失,這是因為系統會重新建立 Activity,而且如果應用程式在其他位置保留其中任一物件的參照,系統將無法執行垃圾收集。
  • 在不同的活動狀態下,切換您的應用程式和其他應用程式。 例如前往主畫面,然後返回應用程式。

匯出及匯入堆積快照錄製內容

你可以 匯出並匯入記憶體快照資料 檔案從分析器的「Past Recordings」分頁中擷取。Android Studio 會儲存 錄製成 .hprof 檔案

或者,您也可以使用其他 .hprof 檔案分析工具,例如 jhat、 您需要將 .hprof 檔案從 Android 格式轉換為 Java SE .hprof 檔案格式。如要轉換檔案格式,請使用 hprof-conv 工具 「{android_sdk}/platform-tools/」目錄提供的資源接著執行含有兩個引數 (原始 .hprof 檔案名稱和已轉換 .hprof 檔案寫入位置) 的 hprof-conv 指令,包括新的 .hprof 檔案名稱。例如:

hprof-conv heap-original.hprof heap-converted.hprof