即,
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)
)?
提前多多感谢!
答案 0 :(得分:11)
如果object
拥有另一个object
的引用,并且当您设置容器对象的引用null
时,子项或包含的object
将自动符合垃圾回收的条件。
有关详细信息,请参阅this link。
答案 1 :(得分:4)
由于A
只有引用到s
,a2.s
指向a1.s
不会影响 { {1}}的垃圾收集。
即a1
符合GC条件,但a1
(或a2.s
)引用的对象不符合GC条件。
答案 2 :(得分:3)
对象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
答案 3 :(得分:1)
您要创建Object A
a1
和a2
的两个参考。
首先,您要将a1
的值分配给a2
。因此,在将值设置为a2
后,GC允许a1
。但reference a2
没有变化。
您还可以在此博客中查看Garbage Collection: