2016-05-02 13 views
2

私は2つのクラスを持っていて、どちらも他のクラスへの参照を保持しています。このJavaコードはメモリをリークしますか?

class A { 
    private B b; 

    public A(B b) { 
     this.b = b; 
    } 
} 

class B { 
    private A a; 

    public B() { 
     a = new A(this); 
    } 
} 

それはメモリリークが発生した場合、どのように私が漏れることなく、私が欲しいものを達成することができますか?

+2

_leak memory_を定義してください。なぜこのコードがそれをしていると思いますか、なぜそうは思わないのですか? –

+0

Aは参照を保持していますが、Aは参照を保持しているためAをクリーンにできないため、AとBはガベージコレクションされません。 – Ukubu

+2

一般的に言えば、Javaのメモリリークを心配する必要はありません。独自のガベージコレクションを行い、オブジェクトが参照されなくなったときにそれらを保持し、オブジェクトを安全に削除できるようにします。それはjavaを持つ特権の一つです。 –

答えて

5

JavaのGCは循環参照を処理するのに十分スマートで、GCルーツからオブジェクトに始まり、オブジェクトがまだ生存しているかどうかをチェックします。だからどこからでも参照されないタイプのA(つまり:GCルート)のオブジェクトがあれば、それはBを参照してもガベージコレクションの対象となります。

循環リンクリストは常に類似しています。

+3

私はそれについて知らなかったが、これは明確な明確化である。 – Ukubu

関連する問題