メモリ使用量(匿名 RSS + スワップ)

メモリ使用量(匿名 RSS + スワップ)は、アプリのメモリ使用量を反映する Android Vitals の指標です。

匿名メモリは、ストレージ上のファイルにバックアップされていないメモリです(ヒープ割り当てや mmap 割り当てメモリなど)。Resident Set Size(RSS)は、物理 RAM に保持されているプロセスで使用されるメモリページ(共有と非共有の両方)の合計数です。匿名メモリの場合、メモリが不足すると、システムはページをスワップ領域(Android では zRAM)に書き込むことができます。

メモリ使用量(匿名 RSS + スワップ)は、ストレージ上のファイルにバックアップされていないアプリのメモリページの合計数を表します。これには、システムによってスワップで保持されているメモリも含まれます。匿名 RSS とスワップをトラッキングすることで、アプリの実際のメモリ使用量(削除できないメモリ使用量)を確認できます。

高いメモリ使用量を特定する

Android Vitals

Android Vitals は、アプリのメモリ使用量を次のプロセス状態別に表示します。

  • フォアグラウンド: アプリのプロセスが表示されます。P99 が高いと、ユーザーが認識するパフォーマンス(ジャンクや OOM クラッシュ)に影響することが多く、不要になった UI コンポーネントやアクティビティを保持することが主な原因です。
  • ユーザーが認識しているサービス: アプリのプロセスが認識可能な状態で実行されています。これには、フォアグラウンド サービス、優先ジョブ、ユーザーが開始するデータ転送ジョブが含まれます。システム バインド サービスや他のアプリによってバインドされたサービスにも拡張できます。これらのサービスは長時間実行タスク用に設計されているため、リークによるメモリの保持やリソースの解放の失敗により、P99 テールが時間の経過とともに増加する可能性があります。
  • バックグラウンド: アプリがバックグラウンド サービスを実行しているか、最近バックグラウンドに移行したものの、まだキャッシュに保存されていません。バックグラウンド処理のリークや解放されていないリソースが複合化されるのは、このときです。このプロセス状態はフォアグラウンド プロセスや知覚可能プロセスよりも重要度が低いため、この状態で大量のメモリを保持しないようにしてください。
  • Cached: アプリがキャッシュに保存されている状態です。この状態は、LMK などのシステム メモリ プレッシャーに非常に敏感です。OS はこのプロセス状態を自由に削除できるため、この状態はデバッグ目的でのみ提供されます。

これらのプロセス状態と onTrimMemory コールバックの関連性については、イベントに応じてメモリを解放するのガイダンスをご覧ください。

Android Vitals では、アプリのメモリ使用量が RAM バケット別に分類されます。メモリ使用量の指標は、50 パーセンタイルと 90 パーセンタイルの最新の日次値とともに、日次パーセンタイル値のタイムラインとして表示されます。

テールスキューを使用してメモリリークを特定する

メモリリークを特定するには、Android Vitals で、一般的なユーザー(P50)と末端のユーザー(P90)の間に差異がないか確認します。一般的なアセットの肥大化は、すべてのパーセンタイルでメモリを均一に増加させますが、メモリリークは時間の経過とともに複合化し、テールエンドのデータを大きく歪めます。

プロセス名で P90 指標と P99 指標を P50 ベースラインと比較する必要があります。P90 と P50 の比率が 3.5 倍を超えている場合は、セッションの延長中にメモリリークが発生している可能性があります。特定のユースケースでは、比率の上昇が必ずしもリークを示すとは限りませんが、特定のワークフローを評価して、メモリ使用量の上昇が想定される動作かどうかを判断する必要があります。