即,在
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)
)?
提前非常感谢!
如果 anobject
持有另一个的引用,object
并且当您设置容器对象的 referencenull
时,child 或 containsobject
自动成为垃圾回收的条件。
有关详细信息,请参阅此链接。
由于A
只有对 的引用,指向不会影响的垃圾收集。s
a2.s
a1.s
a1
iea1
符合 GC 条件,但a2.s
(or a1.s
) 引用的对象将不符合 GC 条件。
对象 A1 符合 GC 条件,因为现在它设置为 null。但是因为字符串“bla”在 GC 中不可用,因为它也被 a2.s 引用。所以只有 a1 对象可用于 GC。
如果是这种情况
A a1 = new A();
a1.s = "bla";
A a2 = new A();
a1 = null;
那么 a1 对象和“bla”都可用于 GC。因为“bla”的所有引用都已删除,但现在情况是
a2.s = a1.s;
a2 指的是相同的字符串“bla”。所以字符串在字符串池中可用,不适用于 GC
在这里,您正在创建两个引用Object A
likea1
和a2
。
首先,您将值分配a1
给。因此a2
,在将值设置为 之后a2
,a1
允许 GC。但不会有任何变化reference a2
。
您还可以查看此博客以了解垃圾收集: