つまり、
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)
)?
よろしくお願いします!
つまり、
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)
)?
よろしくお願いします!
object
が別の参照を保持している場合、object
コンテナ オブジェクトの参照を設定するとnull
、子または含まれるオブジェクトがobject
自動的にガベージ コレクションの対象になります。
詳細については、このリンクを参照してください。
はへの参照A
しかないため、 を指してものガベージ コレクションには影響しません。s
a2.s
a1.s
a1
iea1
は GC の対象となりますが、a2.s
(またはa1.s
) によって参照されるオブジェクトは GC の対象になりません。
オブジェクト 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 で使用できます
ここでは、likeとの2 つの参照を作成しています。Object A
a1
a2
まず、 の値を に割り当てていますa1
。したがって、値をにa2
設定した後、GC で許可されます。しかし、 に変更はありません。a2
a1
reference a2
このブログでガベージ コレクションを確認することもできます。