12

即,在

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

4 回答 4

11

如果 anobject持有另一个的引用,object并且当您设置容器对象的 referencenull时,child 或 containsobject自动成为垃圾回收的条件。

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

于 2013-07-02T06:21:23.740 回答
4

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

iea1符合 GC 条件,但a2.s(or a1.s) 引用的对象将不符合 GC 条件。

于 2013-07-02T06:21:14.037 回答
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

于 2013-07-02T06:26:41.303 回答
1

在这里,您正在创建两个引用Object Alikea1a2

首先,您将值分配a1给。因此a2,在将值设置为 之后a2a1允许 GC。但不会有任何变化reference a2

您还可以查看此博客以了解垃圾收集

于 2013-07-02T06:34:54.813 回答