16

Java ガベージ コレクション ガイドをオンラインでいくつか読んだことがありますが、まだ少し不明確であり、コードにメモリ リークがないように確認したいと考えていました。

Java GC は参照を失ったオブジェクトを収集しますが、その変数にはまだ参照がありますか?

それでは、私が SomeObject を持っているとしましょう:

public class SomeObject {
    public ObjectVar var;

    public SomeObject() {
        var = new ObjectVar();
    }
}

そして私のコード:

SomeObject obj1 = new SomeObject();
SomeObject obj2 = new SomeObject();
obj2.var = obj1.var;
obj1 = null;

したがって、obj1 の var には参照がありますが、obj1 には参照がありません。では、GC は obj1 を破壊しますが、var は存続させますか? (私はそう仮定しています;ただ確認したかっただけです)。ありがとう!

4

4 に答える 4

18

これが何が起こるかです(以下のコメントを参照)

// obj1 and obj1.var get created
SomeObject obj1 = new SomeObject();
// obj2 and obj2.var get created
SomeObject obj2 = new SomeObject();
// old obj2.var becomes eligible for GC
obj2.var = obj1.var;
// obj1 becomes eligible for GC
obj1 = null;

最終的に、GCd を取得しない 2 つのオブジェクトが残りobj2、前者obj1.varは現在 として参照されていobj2.varます。

注: ObjectVarclass が の非静的内部クラスである特殊なケースではSomeObject、への参照を維持するobj1.varことも維持obj1されます。これは、クラスが内部的SomeObject.ObjectVarに type の隠し変数を持ち、内部SomeObjectクラスの外部オブジェクトを参照するためです。

于 2013-05-16T23:37:35.663 に答える
3

はい、もちろん。

varフィールドに保存するものは、実際にはオブジェクト自体ではなく、オブジェクトへの参照であることを忘れないでください。そのため、GC が を収集するとき、特に からの参照があるためobj1varオブジェクトはそのままです (触れてはなりませんobj2) 。

于 2013-05-16T23:33:37.140 に答える
0

はい - 動作はあなたが説明したとおりです。ガベージ コレクションの一般的なルールは、オブジェクトがハード リファレンスを介して到達できない場合にのみ適格になるということです。したがって、この方法でアクセスできるオブジェクトは、ガベージ コレクションされることはありません (ソフト/弱参照を除く)。

于 2013-05-16T23:38:46.590 に答える