Android プラットフォームは、空きメモリが無駄なメモリであるという前提で動作しています。Android は常に利用可能なメモリをすべて使用しようとします。たとえば、システムは、アプリが閉じられた後もメモリに保持するため、ユーザーはすぐに元のアプリに切り替えることができます。このため、Android デバイスは、ほとんどの場合、空きメモリが非常に少ない状態で動作しています(Android のメモリ割り当てを参照)。
Android のローメモリ キラー(LMK)デーモン プロセスは、実行中の Android システムのメモリ状態をモニタリングし、必要最小限のプロセスを停止してシステムのパフォーマンスを許容レベルに維持することでハイメモリ プレッシャーに対応します。
強制終了するプロセスを決定するために、LMK デーモンは、oom_adj_score と呼ばれるメモリ不足スコアを使用して、実行中のプロセスに優先順位を付けます。スコアの高いプロセスから強制終了されます。バックグラウンド アプリは最初に強制終了され、システム プロセスは最後に強制終了されます。次の表は、LMK のスコア付けカテゴリを高いものから順に示しています。1 行目の最もスコアの高いカテゴリのアイテムが最初に強制終了されます。
メモリ プロファイリング ツール
次のツールを使用すると、以下の方法でメモリの問題を特定して診断できます。
- アプリによるメモリの割り当て方法を長期的に監視します。アプリのメモリ使用量、割り当てられている Java オブジェクトの数、ガベージ コレクションの実行タイミングがリアルタイムでグラフに表示されます。
- ガベージ コレクション イベントを開始して、アプリの実行中に Java ヒープのスナップショットを取得します。
- アプリのメモリ割り当てを記録し、割り当てられたオブジェクトをすべて検査して各割り当てのスタック トレースを表示します。
ゲームがネイティブ エンジンで実行されている場合は、HWAddress Sanitizer を使用してネイティブ メモリ割り当てをデバッグします。
Android Studio Memory Profiler
Android Studio は、Android Profiler のコンポーネントとして Memory Profiler を提供しています。これは、ぎこちない動き、フリーズ、さらにはアプリのクラッシュを引き起こす可能性があるメモリリークとメモリチャーンを特定するのに役立ちます。プロファイラには、アプリのメモリ使用量のリアルタイム グラフが表示され、ヒープダンプの取得、ガベージ コレクションの強制実行、メモリ割り当てのトラッキングを行うことができます。
Unity メモリ プロファイリング ツール
Unity Engine を使用してアプリをビルドしている場合は、Unity のメモリ プロファイリング ガイダンスに沿って操作できます。Unity には、Unity でアプリケーションのメモリ使用量を分析するための 2 つのツールが用意されています。
1 つ目は Memory Profiler モジュールです。これは、アプリケーションがメモリを使用している場所に関する基本的な情報を提供する組み込みのプロファイラです。
2 つ目のツールは Memory Profiler パッケージです。これは、プロジェクトに追加できる Unity パッケージです。このパッケージは、Unity エディタに Memory Profiler ウィンドウを追加します。Memory Profiler を使用すると、アプリケーションのメモリ使用量をさらに詳しく分析できます。スナップショットを保存して比較することで、メモリリークを見つけたり、メモリ レイアウトを確認してメモリの断片化の問題を見つけたりできます。
Unreal Memory Insights
Unreal Engine でビルドされたアプリは、Unreal Memory Insights を使用して、メモリブロックに関連付けられた Low Level Memory(LLM)タグやコールスタックなど、メモリの割り当てと割り当て解除に関する詳細情報を確認できます。
Memory Insights のクエリ システムは、任意の時点でのライブ割り当ての検索、メモリ使用量の変化の特定、メモリリークの検出、短期割り当てと長期割り当ての区別を行うことができます。
UE 5.4 以降、Memory Insights は Android プロジェクトのコールスタックによるメモリ トレースをサポートしています。
メモリ不足の分析情報
Android には、ゲームのメモリ要件を削減し、以前のゲーム実行が終了した理由を特定できるコールバックと API が用意されています。
コールバック
非推奨の trim コールバックを登録しないでください。Android には、システムのメモリが上限に達したときにネイティブ メモリ プレッシャー イベントを検出する API がありません。トリム コールバックはメモリ不足による強制終了を防ぐのに役立たなかったため、Android は TRIM_MEMORY_UI_HIDDEN と TRIM_MEMORY_BACKGROUND 以外のすべてのコールバックを非推奨にしました。
ゲームの終了
Android は、利用可能なメモリをすべて使用してアプリやゲームをキャッシュに保存し、すばやく読み込めるようにして(ユーザー エクスペリエンスを向上させて)、メモリが不足すると、最もメモリを消費するアプリやゲームを終了して、デバイスの通常の動作に必要なメモリを確保しようとします。
ゲームのメモリ使用量を改善するための情報、分析情報、ベスト プラクティスは次のとおりです。
ApplicationExitInfoを使用する: この API は、以前のゲーム実行が Android システムによって強制終了された理由を返します。ApplicationExitInfoを使用して、以前のプロセス実行の終了の原因としてメモリ不足がないか確認します。メモリ不足が原因でゲームが強制終了されたかどうかを確認し、そのデバイスでメモリ使用量を減らすようにゲームを最適化できるようにします。- 物理 RAM の合計を確認する: ゲームがフォアグラウンドで強制終了されるのを防ぎ、デバイスの性能に合わせるため、デバイスごとの物理 RAM の合計を確認し、それに基づいてゲームのメモリ使用量を調整します。バックグラウンドに移行した直後にアプリが強制終了されないようにする(プレーヤーがマルチタスクを行えるようにする)ことが目的の場合は、トリム コールバック(特に
TRIM_MEMORY_UI_HIDDEN)を使用して、ゲームのメモリ使用量を減らします。