我有两个班级
Class A
{
//constructor
}
Class B
{
private A a;
public B()
{
a = new A();
}
}
假设我在代码中使用了B [说b
]的对象,在我最终使用它之后,我将其设置为null
。我知道B的对象现在可用于垃圾收集。
我知道在将b设置为null后,立即符合条件进行垃圾回收?但是A型的对象怎么样?将B设置为null
后,它是否可用于立即垃圾回收?或者,在垃圾收集后,垃圾收集是符合条件 ?
理论上,直到B被垃圾收集,a
仍然有参考吗?因此,SUN JVM编译器在设置b = null
;
答案 0 :(得分:5)
GC非常智能,可以跟踪对象图形中的路径,以检查是否可以访问对某个对象的现有引用。它甚至可以检测周期(例如,如果b
持有对a
的引用,而a
持有对b
的引用,则会出现这种情况。
答案 1 :(得分:3)
一旦没有对b的硬引用,就无法达到对a的引用,因此据我所知,两者都有资格进行垃圾回收。
答案 2 :(得分:0)
一般来说,你不应该在乎。它无法访问,你应该让垃圾收集担心其余部分。由于它变得无法访问,因此应立即进行收集。
答案 3 :(得分:0)
在运行Java程序(至少使用Sun JVM)时,还可以使用一些标志,这些标志将提供有关垃圾收集过程中发生的事情的一些调试信息。试试 -verbose:gc 选项。
http://download.oracle.com/javase/6/docs/technotes/tools/solaris/java.html
答案 4 :(得分:0)