如果对其字段有引用,是否会对元素进行垃圾回收?

时间:2013-07-02 06:18:40

标签: java garbage-collection

即,

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 个答案:

答案 0 :(得分:11)

如果object拥有另一个object的引用,并且当您设置容器对象的引用null时,子项或包含的object将自动符合垃圾回收的条件。

有关详细信息,请参阅this link

答案 1 :(得分:4)

由于A只有引用sa2.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 a1a2两个参考

首先,您要将a1的值分配给a2。因此,在将值设置为a2后,GC允许a1。但reference a2没有变化。

您还可以在此博客中查看Garbage Collection