即,在
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只有对 的引用,指向不会影响的垃圾收集。sa2.sa1.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 Alikea1和a2。
首先,您将值分配a1给。因此a2,在将值设置为 之后a2,a1允许 GC。但不会有任何变化reference a2。
您还可以查看此博客以了解垃圾收集: