このページでは、View ベースのレイアウトに固有のメモリリークの検出とトリガーに関する情報について説明します。ヒープダンプのキャプチャと 分析に関する基本情報については、ヒープダンプをキャプチャするをご覧ください。
メモリリークを見つける
メモリリークに関連している可能性があるクラスをすばやくフィルタするには、クラスのプルダウンを開き、[Show activity/fragment leaks] を選択します。Android Studio
には、アプリの
Activityインスタンスと
Fragmentインスタンスでメモリリークが発生していると考えられるクラスが表示されます。フィルタに表示されるデータの種類は次のとおりです。
- 破棄されているが、まだ参照されている
Activityインスタンス。 Fragmentインスタンスで、有効なFragmentManagerがないが、まだ 参照されているもの。
次のような状況では、フィルタによって誤検出が発生することがあります。
Fragmentが作成されたが、まだ使用されていない。Fragmentがキャッシュされているが、FragmentTransactionの一部ではない。
メモリリークを手動で確認するには、クラスとインスタンスのリストを参照して、Retained Size が大きいオブジェクトを見つけます。次のいずれかが原因で生じたメモリリークを探します。
Activity、Context、View、Drawable、ActivityまたはContextコンテナへの参照を保持しているその他のオブジェクト への長期的参照。-
インスタンスを保持できる、
Runnableなどの静的ではない内部クラス。Activity - 必要以上に長くオブジェクトを保持するキャッシュ。
メモリリークの可能性がある場合は、[Instance Details] の [Fields] タブと [References] タブを使用して、目的のインスタンスまたはソースコード行に移動します。
テスト用にメモリリークをトリガーする
アプリでテストするメモリリークを発生させるには、次のいずれかの方法でリークをトリガーします。
- さまざまなアクティビティ状態で、デバイスを縦向きから横向きに回転させてから元に戻す動作を何度か行う。デバイスを回転させると、アプリで
Activity、Context、またはViewオブジェクトのリークがよく発生します。これは、システムによりActivityが再作成され、これらのいずれかのオブジェクトへの参照がどこか別の場所で保持されている場合、システムはこのようなオブジェクトをガベージ コレクションの対象にできないためです。 - さまざまなアクティビティの状態で、自分のアプリと別のアプリを切り替える。 たとえば、ホーム画面に移動してから自分のアプリに戻ります。