Square の LeakCanary を使用して Android アプリのメモリ リークを検出しましたが、静的なシングルトン obj が保持する参照が原因で、Activity の 1 つでリークが検出されました。
My Activity は Q と同じ構造で、Activity にはシングルトン Presenter クラスへの参照がありますが、参照は静的ではありません。
public MyActivity extends Activity {
private MyPresenter mPresenter;
...
onCreate() {
mPresenter = MyPresenter.getInstance()
...
}
}
..
public class MyPresenter { // Different class
private static MyPresenter mInstance;
... singleton code ...
}
このリンクを読んで、それは理にかなっていると思います。http://www.javaworld.com/article/2071737/core-java/plug-memory-leaks-in-enterprise-java-applications.html
Singleton クラスがインスタンス化されると、アプリケーションの存続期間中、メモリ内に残ります。他のオブジェクトもそれへのライブ参照を持ち、その結果、ガベージ コレクトされることはありません。
推奨事項:- 永続的なオブジェクトからオブジェクトを参照することは避けてください。このような使用を避けることができない場合は、弱い参照を使用します。これは、オブジェクトがガベージ コレクションされるのを妨げないタイプのオブジェクト参照です。