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

即,在

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或包含object自动符合垃圾回收的条件。

有关详细信息,请参阅此链接 。

由于A只有s引用 ,指向a1.s 不会影响 a1的垃圾收集。

a1符合GC条件,但a2.s (或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 两个引用 ,如a1a2

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

您还可以在此博客中查看垃圾收集 :