Java垃圾收集资格

时间:2015-03-26 15:16:29

标签: java

我正准备参加OCJP考试。我正在进行模拟测试。这是一段代码片段。

public class GC {
    private Object o;

    private void doSomethingElse(Object obj) {
        o = obj;
    }

    public void doSomething() {
        Object obj = new Object(); // Line 5
        doSomethingElse(obj);      // Line 6
        obj = new Object();        // Line 7
        doSomethingElse(null);     // Line 8
        obj = null;                // Line 9
    }
}

当调用doSomething方法时,Object obj在哪个行之后可用于垃圾回收?

我知道答案是第9行,但根据考试模拟器它是第8行?我不确定谁是对的?

2 个答案:

答案 0 :(得分:6)

模拟器是对的。在第7行中,您将覆盖对实例的本地硬引用,因此第9行中的代码使第二个Object符合GC条件。第一个符合第8行的条件。

更长的解释:

第5行:创建inst1并分配给obj
第6行:将inst1放入this.o。现在有两个对inst1的硬性引用 第7行:创建inst2并分配给objthis.o仍然指向inst1
第8行:清除参考this.o,使inst1可用于GC 第9行:清除参考obj,使inst2可用于GC

答案 1 :(得分:1)

第5行创建的对象在第8行之后有资格进行垃圾回收,而在第7行创建的对象有资格在第9行进行垃圾回收。