如果有对元素字段的引用,java会对元素进行垃圾收集吗?
即在
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)
)
提前多谢
你可以在下面搜索框中键入要查询的问题!
即在
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)
)
提前多谢
# 1 楼答案
对象A1符合GC条件,因为现在它被设置为空。但由于字符串“bla”在GC中不可用,因为它也由a2引用。s、 因此,只有a1对象可用于GC
如果是这样的话
然后a1对象和“bla”都可用于GC。因为“bla”的所有引用都被删除了,但现在情况是这样的
a2指的是同一个字符串“bla”。所以字符串在stringpool中可用,而不是用于GC
# 2 楼答案
如果一个
object
持有另一个object
的引用,并且当您设置容器对象的引用null
时,子对象或包含的object
将自动符合垃圾收集的条件详见this link
# 3 楼答案
在这里,您正在创建两个
Object A
的引用,比如a1
和a2
首先,将}不会有任何变化
a1
的值赋值给a2
。因此,在将值设置为a2
之后,GC允许a1
。但是{你也可以在这个博客上查看Garbage Collection:
# 4 楼答案
由于
A
只有一个对s
的引用,a2.s
指向a1.s
不会影响a1
的垃圾收集也就是说
a1
符合GC条件,但a2.s
(或a1.s
)所指的对象将不符合GC条件