2016-07-04 1 views
0

私はこのようなクラス構造を持っています。Androidアプリケーションのメモリリーク

class A 
    { 
     B b; 

     A() 
     { 
      b = new B(); 
      b.a = this; 
     } 
    } 

    class B 
    { 
     A a; 
    } 

    class C 
    { 
     A a = new A(); 

     //a is ready for Garbage collection 
     a = null; 
    } 

アクティビティDestroy()では、変数a = nullを設定します。しかしヒープでは、変数bがBのリファレンスを保持していることがわかりました。

誰でも説明できますか?

+0

おそらくまだ収集されていない可能性があります。 gcを強制しようとしましたか? – Memme

+0

@ Memme gcを強制するのは悪い考えです!メモリリークを止めて、それを隠蔽する必要はありません。 – apmartin1991

+0

@ apmartin1991もちろん。しかし、私は確かにそれをチェックしただけです。とにかく、Cで新しいオブジェクトをインスタンス化してnullにするという事実は、その特定のインスタンスのみを収集します。しかし、私は間違っている可能性があります:) – Memme

答えて

1

Javaでは、非静的な内部クラスと匿名クラスは、その外部クラスへの暗黙的な参照を保持します。静的内部クラスは、他の 手にはありません。だから、

たとえば、あなたはごみ収集さと アプリケーションのすべてのリソースを漏れるの活動状況を防ぐことができますクラスBまたはCの実行時間の長い操作を、行っている場合。

Here is a great post about memory leaking on Android with static inner classes, written by Alex Lockwood

別の潜在的な理由は、あなたが正しくバックグラウンドスレッドを処理していないと、これらはまだ実行されているか、将来の実行がスケジュールされていることをすることができます。 Alex Lockwoodが書いた通りthis post

実行中のスレッドがあなたのためにクリーンアップされることは想定しないでください。

最後に、メモリリーク検出のための優れたツールであるleakcanaryを統合することができます。どのオブジェクトが参照を保持し、ガベージコレクションを防止するのかをグラフで示します。

+0

真ですが、このコードには内部クラスまたはネストされたクラスはありません – maciekjanusz

関連する問題