1

この質問は、LinkedListデータ構造を学習しているときに発生します。すべてのリンク(またはノード) が、データのリンクへの次のポイントの2 つのフィールドを含むオブジェクトによって表されると仮定します。特定のノードを削除したい場合は、明らかに前のリンクの次のフィールドを更新します。しかし、削除されたリンクの次のフィールドを null に設定して、ガベージ コレクターによって再利用されるようにする必要がありますか?

私の説明が明確でない場合は、質問を一般化 (または単純化) しようとします。同じクラスの別のオブジェクトa2を参照するフィールドを持つクラスAのオブジェクトa1を想定します。オブジェクトa1への参照がない場合、ガベージ コレクターの対象になりますか? または、 a1の参照フィールドを明示的にnullに設定する必要がありますか? (オブジェクトa2は気にしないでください。 a1の参照フィールド以外にも参照があります)。

4

4 に答える 4

5

ガベージ コレクターは、理想的には、プログラム フローでは到達できないすべてのオブジェクトを収集します。このオブジェクトが JVM 内のすべてへの参照を持っている場合でも。プログラムの実行中のすべてのスレッドにオブジェクトへの直接的または間接的な
参照 が含まれていない場合、オブジェクトは到達不能になります。 直接参照は次のようになります。

void main(String... args){
  Object a = new Object(); // <- from here main thread of program 
                           //    has reference to object `a`
  ...
}

間接参照は次のようになります。

void main(String... args){
   List b = new ArrayList();
   b.add(new Object()); // <- here you can't access object by typing `a`
   // as in previous example, but you can get access with `b.get(0);`
   // so that object can be accessed indirectly -> it is reachable.
}

また、相互に参照しているオブジェクトの大きな島のケースも適切に処理しますが、プログラム フローから到達することはできません。

MyClass a = new MyClass();
MyClass b = new MyClass();
a.field = b;
b.field = a;
// at this point a and b are reachable so they cannot be collected
b = null;
// at this point b's object is reachable indirectly through `a.field`
// so neither a nor b can be collected
a = null;
// at this point you cannot reach neither a nor b
// so a and b can be garbage collected, 
// despite the fact that a is referenced by b and vice versa

UPD: 例を追加し、いくつかの単語を変更して回答を明確にしました。

于 2013-04-02T13:10:43.373 に答える
1

フィールドがまだ他のオブジェクトを参照している場合でも、オブジェクト a1 を収集できます。そのフィールドを null に設定する必要はありません。

ガベージ コレクタは、到達できないオブジェクトを収集します。オブジェクトは、他のオブジェクトへの参照を保持し、収集することができます。オブジェクトは、他の到達不能オブジェクトからの参照を持っていても、収集されている可能性があります。

于 2013-04-02T13:33:49.800 に答える
0

ガベージ コレクターが実行されると、ガベージ コレクターへa1の参照がなくなったため、ガベージ コレクションが必要であることがわかります。

a1また、オブジェクトを指している参照フィールドを削除しますa2

しかし、それでもa2(あなたが言及しa2 たように、 a1 の参照フィールド以外に他の参照があるため)、ガベージコレクションの対象にならないため、残ります。

于 2013-04-02T13:17:23.247 に答える