当一个对象有资格使用垃圾收集器时?

时间:2012-08-29 16:23:02

标签: java garbage-collection scjp

考虑以下示例代码:

1.  public class GC {
2.      private Object o;
3.      private void doSomethingElse(Object obj) { o = obj; }
4.      public void doSomething() {
5.          Object o = new Object();
6.          doSomethingElse(o);
7.          o = new Object();
8.          doSomethingElse(null);
9.          o = null;
10.     }
11. }

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

一个。第5行

B中。第6行

℃。第7行

d。第8行

电子。第9行

F。第10行

答案:D

为什么D?确实,当第6行被执行时,第5行中创建的对象现在被实例var o和本地var o引用,当第8行被执行时,对象现在只被本地引用引用,所以为什么要回答是D和第9行执行后会发生什么?感谢。

2 个答案:

答案 0 :(得分:9)

这个问题让IMO感到困惑的主要原因是有2个变量名为o。一个是实例变量o,另一个是方法o内的局部变量doSomething()

Time            instance var o    local var o
Before Line 5:            null               
Line 5:                   null       Object#1
Line 6:               Object#1       Object#1
Line 7:               Object#1       Object#2
Line 8:                   null       Object#2   <- No more references to Object#1

在第8行(或执行后),对象#1有资格收集。

答案 1 :(得分:1)

这个问题有点令人困惑,因为在第二次调用第3行之后该对象符合条件,因为它清除了第二个引用o