記憶體不足終止工具

Android 平台執行時會將未使用的記憶體視為浪費的記憶體,Android 會持續設法用掉所有可用的記憶體。舉例來說,系統會在應用程式關閉後將其留在記憶體內,方便使用者快速切換回這些應用程式。因此,Android 裝置在執行時,通常不會發生大量記憶體未用到的情況 (請參閱這裡的 Android 記憶體配置)。

Android 記憶體不足終止工具 (LMK) Daemon 程序會監控執行中 Android 系統的記憶體狀態,並在記憶體壓力過高時,終止最不重要的程序,確保系統效能維持在可接受的程度。

LMK 精靈會使用稱做 out of memory 的「記憶體不足」分數 (即 oom_adj_score) 為執行中的程序排出優先順序,藉此決定要終止哪些程序。系統會優先終止分數較高的程序。背景應用程式的終止順位最高,系統程序的順位最低。下表由高到低列出 LMK 的分數類別。屬於第一列最高分類別的項目會最先遭到終止:

Android 程序依分數由高到低排序:背景應用程式、先前的應用程式、主畫面應用程式、服務、可察覺的應用程式、前景應用程式、持續性、系統和原生。
圖 1. Android 程序,頂端為最高分,而底部為最低分。

記憶體用量分析工具

下列工具提供以下幾種方法,可幫助您找出及診斷記憶體問題:

  • 瞭解應用程式配置記憶體的變化趨勢。您可以查看應用程式記憶體用量的即時圖表、已配置的 Java 物件數量,以及進行垃圾回收的時間點。
  • 在應用程式執行期間,啟動垃圾收集事件並提供 Java 堆積的數據匯報。
  • 記錄應用程式的記憶體配置、檢查所有配置的物件,並檢視每個配置的堆疊追蹤。

如果遊戲是在原生引擎上執行,請使用 HWAddress Sanitizer 偵錯原生記憶體配置。

Android Studio 記憶體分析器

Android Studio 提供記憶體分析器做為 Android 分析器的元件,可協助您找出可能導致延遲、沒有回應、甚至應用程式異常終止的記憶體流失和記憶體抖動情形。分析器會顯示應用程式記憶體用量的即時圖表,並可讓您擷取記憶體快照資料、強制執行垃圾回收,以及追蹤記憶體配置。

圖 2. 在 Android Studio 記憶體分析器中查看全域 JNI 參照。

Unity 記憶體剖析工具

如果您使用 Unity 引擎建構應用程式,可以參考 Unity 記憶體剖析指南。Unity 提供兩種工具,可分析 Unity 應用程式的記憶體用量。

第一個是記憶體分析器模組,這項內建分析器可提供應用程式記憶體用量的基本資訊。

記憶體模組會顯示記憶體配置,例如紋理記憶體和網格記憶體。
圖 3. 選取「Memory」模組的 Unity 分析器視窗。

第二項工具是 記憶體分析器套件,這是您可以新增至專案的 Unity 套件。這個套件會在 Unity 編輯器中新增額外的記憶體分析器視窗。記憶體分析器可讓您更詳細地分析應用程式的記憶體用量。您可以儲存及比較快照,找出記憶體洩漏問題,或查看記憶體配置,找出記憶體片段化問題。

圖 4. 使用「記憶體分析器」視窗分析記憶體快照。

Unreal Memory Insights

使用 Unreal Engine 建構的應用程式可以透過 Unreal Memory Insights 查看記憶體配置和解除配置的詳細資訊,包括與記憶體區塊相關聯的低階記憶體 (LLM) 標記和呼叫堆疊。

記憶體洞察查詢系統可隨時找出即時分配情形、識別記憶體用量變化、找出記憶體流失,以及區分短期和長期分配。

從 UE 5.4 開始,Memory Insights 支援 Android 專案的記憶體追蹤和呼叫堆疊。

「記憶體洞察」追蹤器顯示主要記憶體圖表、即時分配計數,以及分配/釋放事件計數。
圖 5. Unreal 的記憶體洞察追蹤器。

記憶體不足深入分析

Android 提供回呼和 API,可讓您減少遊戲的記憶體需求,並判斷先前遊戲執行作業終止的原因。

回呼

請勿註冊已淘汰的 trim 回呼。當系統達到記憶體上限時,Android 沒有任何 API 可偵測原生記憶體壓力事件。由於修剪回呼無法有效避免記憶體不足而終止程序,因此 Android 已淘汰所有修剪回呼TRIM_MEMORY_UI_HIDDENTRIM_MEMORY_BACKGROUND 除外。

遊戲終止

Android 會盡可能使用所有可用記憶體來快取應用程式和遊戲,確保這些項目能快速載入 (提升使用者體驗),但如果記憶體不足,系統就會終止最耗用記憶體的應用程式和遊戲,釋出記憶體供裝置正常運作。

如要進一步瞭解如何提升遊戲記憶體用量,請參閱下列資訊、深入分析和最佳做法:

  • 使用 ApplicationExitInfo: 這個 API 會傳回 Android 系統終止先前遊戲執行的原因。使用 ApplicationExitInfo 檢查先前程序執行是否因記憶體不足而終止。確認遊戲是否因記憶體不足而終止,以便最佳化遊戲,減少在該裝置上使用的記憶體。
  • 查看實體 RAM 總量: 為防止遊戲在前台執行時遭到終止,並配合裝置效能,請查看每個裝置的實體 RAM 總量,據此微調遊戲記憶體用量。如果目標是避免應用程式在移至背景後不久遭到終止 (讓玩家可以執行多項工作),請使用 trim 回呼 (具體來說是 TRIM_MEMORY_UI_HIDDEN),減少遊戲的記憶體用量。

其他資源