如果对其字段有引用,是否会对元素进行垃圾回收?
即,在
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
两个引用 ,如a1
和a2
。
首先,您将a1
值分配给a2
。因此,在将值设置为a2
,GC允许a1
。 但是reference a2
没有变化。
您还可以在此博客中查看垃圾收集 :