2013-07-11 9 views
7

目的Cでは、2つの異なる参照が互いにポイントする可能性があります。2つのオブジェクト参照が互いにポイントします

これはJavaで可能ですか?つまり、2つのオブジェクト参照が互いにポイントできますか?可能であれば、いつガベージコレクションを行うのですか?

ネストされたクラスの場合、2つのオブジェクト(内部クラスと外部クラス)がリンクされています。これらのオブジェクトはどのようにガベージコレクトされていますか?

+2

オブジェクト参照は、オブジェクトのみを指すことができます。お互いを指し示す2つのオブジェクト参照が何を意味していますか? –

+0

ああ!私はjavaに新しいです!ネストされたクラスの場合、2つのオブジェクト(内部クラスと外部クラス)が互いにリンクされます。私がここで何か意味があれば、どのようにこれらの2つはゴミを収集することができます –

答えて

24

私はあなたが循環参照について話していると仮定します。 JavaのGCは、GCルートからチェーンを介して到達できない場合、オブジェクトを「ゴミ」と見なします。オブジェクトはサイクルを形成するために互いを指し示すかもしれませんが、ルートから切り離されてもGCに適格です。

は、JavaでGCのルーツの4種類があります

  1. ローカル変数は、スレッドのスタックによって生かされています。これは実際のオブジェクト仮想参照ではないため、表示されません。すべての目的と目的のために、ローカル変数はGCルーツです。

  2. アクティブなJavaスレッドは常にライブオブジェクトとみなされ、GCルーツです。これはスレッドローカル変数にとって特に重要です。

  3. 静的変数は、そのクラスによって参照されます。この事実は事実上GCのルーツとなる。クラスそのものはガベージコレクションされ、参照されているすべての静的変数が削除されます。これは、アプリケーションサーバー、OSGiコンテナー、またはクラスローダーを一般的に使用する場合に特に重要です。

  4. JNI参照は、ネイティブコードがJNI呼び出しの一部として作成したJavaオブジェクトです。こうして作成されたオブジェクトは、JVMがネイティブコードによって参照されているかどうかを知らないため、特別に扱われます。このようなオブジェクトは、GCルートの非常に特殊な形式を表します。

あなたはより多くの情報のためhereをも読み取ることができます。もちろん

enter image description here

+0

ありがとうございます。 –

3

あなたは、オブジェクトが相互に参照することができます。両方のオブジェクトにポインタを渡すだけで、完全に有効です。

ただし、これは、オブジェクトがGCルートから引き続きアクセス可能であるという意味ではありません。それを(グラフ)ツリーと考えてください。トランクから完全なブランチを切断した場合、いくつのオブジェクトが関わっているかに関わらず、ブランチ全体が失われたり、互いの参照が維持されたりします。

4

はい、これを行うことができます。このように:両方のオブジェクトが互いに以外のもの、または現在実行中のコードから「到達不能」であり、他のオブジェクトによって指し示されていないとき

class Pointy { 
    public Pointy other; 
} 

Pointy one = new Pointy(); 
Pointy two = new Pointy(); 
one.other = two; 
two.other = one; 

彼らは、ガベージコレクションです。 Javaガベージコレクタは"tracing" garbage collectorsです。これは、この種の問題を発見できることを意味します。

逆に、「モダンな」ガーベッジコレクションを持たないObjective C(デフォルトのものはわかりません)では、この種の問題を通常検出できないため、オブジェクトがリークする可能性があります。

関連する問題