Java垃圾收集资格

Abh*_*ngh 1 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
    }
}
Run Code Online (Sandbox Code Playgroud)

调用doSomething方法后,Object obj可用于垃圾回收吗?

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

Aar*_*lla 6

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

更长的解释:

5号线:创建inst1并分配给obj
6号线:把inst1成this.o.现在有两个对inst1
第7行的硬引用:创建inst2和赋值obj.this.o仍指向inst1
第8行:清除参考this.o,inst1可用于GC
第9行:清除参考obj,inst2可用于GC