12

つまり、

class A {
    public String s;
}

A a1 = new A();
a1.s = "bla";
A a2 = new A();
a2.s = a1.s;
a1 = null;

a1ガベージコレクションされるか、それともコレクションを許可することへの参照ですかa1.s(そして、むしろディープコピーを行う必要がありますa2.s = new String(a1.s))?

よろしくお願いします!

4

4 に答える 4

11

objectが別の参照を保持している場合、objectコンテナ オブジェクトの参照を設定するとnull、子または含まれるオブジェクトがobject自動的にガベージ コレクションの対象になります。

詳細については、このリンクを参照してください。

于 2013-07-02T06:21:23.740 に答える
4

はへの参照Aしかないため、 を指してものガベージ コレクションには影響しません。sa2.sa1.s a1

iea1は GC の対象となりますが、a2.s(またはa1.s) によって参照されるオブジェクトは GC の対象になりません。

于 2013-07-02T06:21:14.037 に答える
3

オブジェクト A1 は、null に設定されているため、GC の対象となります。ただし、文字列「bla」は a2.s によっても参照されるため、GC では使用できません。したがって、GC で使用できるのは a1 オブジェクトのみです。

このような場合は

A a1 = new A();
a1.s = "bla";
A a2 = new A();
a1 = null;

a1 オブジェクトと「bla」の両方を GC で使用できます。「bla」のすべての参照が削除されているためですが、現在は

a2.s = a1.s;

a2 は同じ文字列「bla」を参照しています。したがって、文字列は GC ではなく stringpool で使用できます

于 2013-07-02T06:26:41.303 に答える
1

ここでは、likeとの2 つの参照を作成しています。Object Aa1a2

まず、 の値を に割り当てていますa1。したがって、値をにa2設定した後、GC で許可されます。しかし、 に変更はありません。a2a1reference a2

このブログでガベージ コレクションを確認することもできます。

于 2013-07-02T06:34:54.813 に答える