组合对象的垃圾收集

时间:2011-05-13 13:15:30

标签: java garbage-collection

我有两个班级

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;

后会立即检测到这一点

5 个答案:

答案 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)

只要将ObjectB设置为null(*条件是ObjectA未被任何其他 live 对象引用),对象A也将成为符合条件的垃圾回收。 这种情况被称为“隔离岛”。

Here是对这种情况的一个很好的解释。 (Here是SCJP书中的另一个解释)