メモリは、Android 搭載デバイスの重要な有限リソースです。Android プラットフォーム デベロッパーや OEM にとって、Java ランタイムから Linux カーネルまで、あらゆるレベルでメモリがどのように機能するかを理解することは、パフォーマンスが高く安定したシステムを構築するうえで不可欠です。
このガイドでは、Android メモリ アーキテクチャの包括的な概要、分析に利用できるツール、メモリ関連の問題を特定して解決するための実践的な演習について説明します。
目標
このガイドを修了すると、次のことができるようになります。
- Zygote プロセスモデルやメモリマップド ファイルなど、Android メモリの基本的なコンセプトを説明する。
- Resident Set Size(RSS)、Proportional Set Size(PSS)、Unique Set Size(USS)の違いを説明する。
dumpsys meminfoやshowmapなどの標準的なコマンドライン ツールを使用して、メモリ使用量をすばやく評価する。- AHAT を使用して Java ヒープダンプをキャプチャして分析し、メモリリークや過剰な割り当てを見つける。
- Perfetto と
heapprofdを使用して、システム全体の Java メモリとネイティブ メモリの両方をプロファイリングする。 - Pressure Stall Information(PSI)などのシステム全体のメモリプレッシャー インジケーターを理解し、Low Memory Killer(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)が必要になる場合があります。
最初に見る: 基本的なコンセプト