假设:
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行之后。解释我在哪里错了..
答案 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行进行垃圾收集,因为不会使用新创建的对象。