Android メモリリークの根本的な原因
Androidメモリーリークの根本的な原因は、オブジェクトが使用されなくなった後でもガベージコレクタによって適切に回収されず、メモリーの継続的な使用と増加を引き起こすことです。これは主に以下の一般的な状況が原因です。
- 静的な参照: オブジェクトが範囲外で静的に参照され、ガベージコレクターによって回収できないこと。
- アクティビティやフラグメントで自身のコンテキストを他のオブジェクトに参照として渡すと、それらのオブジェクトのライフタイムがアクティビティやフラグメントより長くなると、メモリリークが発生する原因となります。
- 匿名内部クラス参照: 匿名内部クラスの寿命が外部クラスよりも長い場合、外部クラスがGCされない原因
- ハンドラ参照:ハンドラを使用する場合は、ハンドラのライフサイクルが参照しているアクティビティやフラグメントよりも長くなると、アクティビティやフラグメントの解放ができなくなります。
- シングルトンパターンの参照:シングルトンパターンで作成したオブジェクトがメモリに残り、シングルトンオブジェクトが他のオブジェクトの参照を持ち、そのオブジェクトのライフサイクルが長い場合は、メモリリークが発生します。
開発中に使っていないオブジェクト参照を随時解放し、不要になったオブジェクトへの参照を保持しないように注意し、メモリリークの発生を防ぐためにウィーク参照、ソフト参照などの機能を積極的に利用する。