Java中的垃圾收集器在null之后

时间:2013-02-08 12:24:21

标签: java garbage-collection

我正在从一本java认证书中做一些练习。在有关垃圾收集的问题中,它们提供以下代码:

class Test {
   private Demo d;
   void start() {
      d = new Demo();
      this.takeDemo(d);
   }
   void takeDemo(Demo demo) {
      demo = null;
      demo = new Demo();
   }
}

问题是

  

在第4行创建的Demo对象何时符合垃圾条件   集合?

我会说它可以在指令demo = null之后收集;因为不再引用它,但他们给出的答案是:

  

当运行此代码的实例符合垃圾资格时   集合

我错过了什么?

6 个答案:

答案 0 :(得分:5)

Java is "pass-by-value",因此此声明demo = null;仅影响demotakeDemo的本地副本。它不会将d设置为null,只要封闭实例可以访问,就可以访问{。}}。

答案 1 :(得分:1)

您正确地注意到demo设置为null。但是d不是。它仍然保留对同一对象的引用。因此答案。

答案 2 :(得分:1)

因为demo = null只是更改方法参数demo的值,这是方法的本地值,并且不会影响字段d的值。请记住,在Java中,所有方法参数都按值传递。

答案 3 :(得分:0)

在方法d完成之前,对局部变量start()的引用是“活动的”。在此之前,垃圾收集不应该释放它。

答案 4 :(得分:0)

第4行的演示只能与Test实例一起收集。或者,如果再次调用start方法(将收集旧的Demo并重新创建)

takeDemo方法对第一个Demo没有影响。但它创造了第二个演示。在takeDemo方法完成后,可以立即收集第二个Demo。

答案 5 :(得分:0)

当你调用this.takeDemo(d);参考d的值被复制到参数demo,因此d和demo都引用了第4行中创建的对象。现在在方法内部,当您将变量demo设置为null时,d仍然保持引用,因此对象将是一旦“实例测试”类被垃圾收集,就有资格进行垃圾收集。