ローメモリ キラー

Android プラットフォームは、空きメモリが無駄なメモリであるという前提で動作しています。Android は、常に利用可能なメモリをすべて使用しようとします。たとえば、システムは、アプリが閉じられた後もメモリに保持するため、ユーザーはすぐに元のアプリに切り替えることができます。このため、Android デバイスは、ほとんどの場合、空きメモリが非常に少ない状態で動作しています(Android のメモリ割り当てをご覧ください)。

Android のローメモリ キラー(LMK)デーモンプロセスは、実行中の Android システムのメモリ状態をモニタリングし、必要最小限のプロセスを停止してシステムのパフォーマンスを許容レベルに維持することでハイメモリ プレッシャーに対応します。

強制終了するプロセスを決定するために、LMK デーモンは、oom_adj_score と呼ばれるメモリ不足スコアを使用して、実行中のプロセスに優先順位を付けます。スコアの高いプロセスから強制終了されます。バックグラウンド アプリが最初に強制終了され、システム プロセスが最後に強制終了されます。次の表は、LMK のスコア付けカテゴリを高いものから順に示しています。1 行目の最もスコアの高いカテゴリのアイテムが最初に強制終了されます。

Android プロセスは、スコアの高い順に、バックグラウンド アプリ、以前のアプリ、ホームアプリ、サービス、認識可能なアプリ、フォアグラウンド アプリ、永続、システム、ネイティブにランク付けされます。
図 1. Android プロセス(上が高スコア、下が低スコア)。

Android Vitals の LMK 指標

Android Vitals は、アプリの LMK 発生率をモニタリングして改善するために役立ちます。Android Vitals では、ユーザーが認識した LMK 発生率の 1 つの LMK 発生率のみを測定します。

この指標は、ユーザーが認識した LMK が 1 回以上発生した 1 日のアクティブ ユーザーの割合を示します。ユーザーが認識した LMK とは、ユーザーが気付いた可能性が高い LMK のことです。たとえば、アプリがアクティビティを表示しているときや、フォアグラウンド サービスとして実行しているときに発生する LMK です。

この指標は、Android Vitals の [安定性] セクションで確認できます。

図 2. Android Vitals で [ユーザーが認識した LMK 発生率] にアクセスします。

ANR やクラッシュなどの他のコア指標と同様に、指標をフィルタしたり、指標をピアと比較したり、指標の変化を長期(最長 3 年間)にわたってモニタリングしたりできます。既存のアプリのデータは、2025 年 1 月 28 日より利用可能になります。

図 3. Android Vitals の LMK 発生率の概要。

メモリ プロファイリング ツール

次のツールを使用すると、以下の方法でメモリの問題を特定して診断できます。

  • アプリによるメモリの割り当て方法を長期的に監視します。アプリのメモリ使用量、割り当てられている Java オブジェクトの数、ガベージ コレクションの実行タイミングがリアルタイムでグラフに表示されます。
  • ガベージ コレクション イベントを開始して、アプリの実行中に Java ヒープのスナップショットを取得します。
  • アプリのメモリ割り当てを記録し、割り当てられたオブジェクトをすべて検査して、各割り当てのスタック トレースを表示します。

Android Studio Memory Profiler

Android Studio には、Android Profiler のコンポーネントとして Memory Profiler が用意されています。これは、スタッタリング、フリーズ、さらにはアプリのクラッシュを引き起こす可能性があるメモリリークとメモリチャーンを特定するのに役立ちます。プロファイラには、アプリのメモリ使用量のリアルタイム グラフが表示され、ヒープダンプの取得、ガベージ コレクションの強制実行、メモリ割り当てのトラッキングを行うことができます。

図 4. Android Studio Memory Profiler でグローバル JNI 参照を表示。

Unity メモリ プロファイリング ツール

Unity Engine を使用してアプリをビルドしている場合は、Unity メモリ プロファイリングのガイダンスに沿って対応してください。Unity には、Unity のアプリケーションのメモリ使用量を分析するためのツールが 2 つ用意されています。

1 つ目は Memory Profiler モジュールです。これは、アプリケーションでメモリが使用されている場所に関する基本情報を提供する組み込みプロファイラです。

メモリ モジュールには、テクスチャメモリやメッシュメモリなどのメモリ割り当てが表示されます。
図 5. [メモリ] モジュールが選択された Unity Profiler ウィンドウ。

2 つ目のツールは、プロジェクトに追加できる Unity パッケージである Memory Profiler パッケージです。このパッケージにより、Unity Editor に Memory Profiler ウィンドウが追加されます。Memory Profiler を使用すると、アプリケーションのメモリ使用量をさらに詳しく分析できます。スナップショットを保存して比較することでメモリリークを検出したり、メモリレイアウトを表示してメモリ断片化の問題を見つけたりできます。

図 6. Memory Profiler ウィンドウを使用してメモリ スナップショットを分析する。

Unreal Memory Insights

Unreal Engine でビルドされたアプリでは、Unreal Memory Insights を使用して、メモリの割り当てと割り当て解除に関する詳細情報を確認できます。これには、メモリブロックに関連付けられた低レベルメモリ(LLM)タグやコールスタックが含まれます。

Memory Insights クエリシステムでは、任意の時点でのライブ割り当てを見つけ、メモリ使用量の変化を特定し、メモリリークを特定し、短期的な割り当てと長期的な割り当てを区別できます。

UE 5.4 以降、Memory Insights は Android プロジェクトのコールスタックによるメモリ トレースをサポートしています。

メインメモリ グラフ、ライブ割り当て数、割り当て/解放イベント数を示す Memory Insights トラッカー。
図 6. Unreal のメモリ分析トラッカー。

参考情報