OCJP考试垃圾收集

时间:2013-09-18 08:40:34

标签: java garbage-collection

假设:

public class GC {
    private Object o;
    private void doSomethingElse(Object obj) { o = obj; }
    public void doSomething() {
        Object o = new Object(); // line 5
        doSomethingElse(o);
        o = new Object(); // line 7
        doSomethingElse(null);
        o = null;
    }
}

当调用doSomething方法时,在第5行创建Object之后 可用于垃圾收集?

我认为答案是在第7行之后。答案是在第8行之后。解释我在哪里错了..

3 个答案:

答案 0 :(得分:3)

对象只有在无法访问时才能进行垃圾回收。在第7行之后的代码中,您仍然可以通过this.o字段访问(到达)第5行创建的对象。

在第8行之后this.o == null,因此在第5行创建的对象变得无法访问。

可达性规则:

答案 1 :(得分:2)

第5行中的Object o是方法doSomething()的局部变量。

执行第8行后它将变为孤立。

由于本地和全局引用都不再引用该对象。

修改

虽然现在已经很晚了,但我希望有一天它会对某人有所帮助。

您可以使用我正在开发的名为gcRadar的库来接收此类事件。它在孤立对象时以及在对象的实际垃圾收集之后提供事件。

欢迎任何有关图书馆改进的建议。

答案 2 :(得分:0)

对于某个对象,可用于GC并不能确保该对象立即被GC控制。这实际上取决于GC的实施。

由于您在谈论Java,它还取决于正在运行的程序的状态。该程序可以被解释,也可以是JIT。

如果正在解释它,我认为当它设置为null时,它将在第8行的GC中可用。如果它是JIT,它可以(逻辑上)在第7行进行垃圾收集,因为不会使用新创建的对象。