記憶體是 Android 裝置上非常重要的有限資源。身為 Android 平台開發人員或原始設備製造商,瞭解各層級的記憶體運作方式 (從 Java 執行階段到 Linux 核心) 對於建構效能穩定系統至關重要。
本指南將全面介紹 Android 記憶體架構、可用的分析工具,以及實作練習,協助您找出並解決記憶體相關問題。
目標
完成本指南後,您將能夠:
- 說明 Android 記憶體的基本概念,包括 Zygote 程序模型和記憶體對應檔案。
- 區分常駐集大小 (RSS)、比例集大小 (PSS) 和不重複集大小 (USS)。
- 使用
dumpsys meminfo和showmap等標準指令列工具,快速評估記憶體用量。 - 使用 AHAT 擷取及分析 Java 堆積傾印,找出流失和過度分配的情形。
- 使用 Perfetto 和
heapprofd剖析整個系統的 Java 和原生記憶體。 - 瞭解系統層級的記憶體壓力指標,例如壓力停滯資訊 (PSI),並監控記憶體不足終止工具 (LMK) 活動。
- 觀察核心層級的回收活動,包括 ZRAM 交換和頁面快取逐出。
指南結構
本指南分為以下幾個章節,建議依序閱讀:
- 基本概念:Android 記憶體的核心技術原則。
- 快速評估工具:使用
meminfo、showmap和procstats快速分類。 - 分析 Java 記憶體:使用 AHAT 深入瞭解 Java 堆積。
- 點陣圖和記憶體:瞭解圖片對 RAM 的影響,以及如何使用工具進行剖析。
- 分析原生記憶體:使用 Perfetto 和
heapprofd分析 C/C++ 記憶體。 - WebView 和記憶體:瞭解 WebView 的多程序架構和記憶體用量。
- 應用程式程式碼就是記憶體:瞭解類別載入和 DEX 膨脹對 RAM 的影響。
- 執行緒和記憶體:分析原生執行緒堆疊的成本。
- 記憶體區域性和效能:瞭解資料存取模式如何影響 CPU 效能。
- 服務繫結和程序狀態: 瞭解跨程序依附元件如何影響 OOM 分數。
- 全系統疑難排解:監控 PSI、LMK、ZRAM 交換和網頁快取清除。
- 記憶體回收:逐出和交換:瞭解 memcg、費用和主動回收 (使用
memory.reclaim)。 - kswapd 和 lmkd 互動: 瞭解 kswapd 和 lmkd 如何在壓力下協同運作。
先決條件和環境
本指南提供參考工作流程、基準資料和案例研究,說明如何診斷及解決 Android 記憶體問題。
- 分析工具:本指南中的技術主要使用標準 Android 效能工具,包括 Perfetto、
dumpsys meminfo、showmap和 AHAT。 - 根層級權限:部分系統層級的診斷工作流程 (例如檢查核心記憶體壓力或硬體 PMU 計數器) 需要在 userdebug 裝置或模擬器建構版本上,提升至根層級權限 (
adb root)。
從這裡開始:基本概念