4

鉴于:

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 行之后..bt 答案在第 8 行之后..解释我哪里错了..

4

3 回答 3

3

一个对象只有在它变得不可访问时才能被垃圾回收。在第 7 行之后的代码中。您仍然可以通过该this.o字段访问(到达)在第 5 行创建的对象。

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

可达性规则:

于 2013-09-18T08:48:12.113 回答
2

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

执行第 8 行后,它将成为孤立的。

因为本地和全局引用都将不再引用该对象。

编辑:

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

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

欢迎对图书馆提出任何改进建议。

于 2013-09-18T08:48:19.957 回答
0

对于一个对象,可用于 GC 并不能确保该对象将立即被 GC'ed。这实际上取决于 GC 的实现。

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

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

于 2013-09-18T09:09:15.957 回答