这段代码可以垃圾收集?

时间:2014-09-29 00:31:27

标签: java garbage-collection

我对Java垃圾收集有一些疑问。

下面是一些测试类的代码

public class ChildMaker{
  public Child createChild(){
      Child c = new Child();
      return c;
  }
}

我正在进行的实际测试

public class TestChildMaker{
    public getChild(){
        ChildMaker maker = new ChildMaker();
        Child c = maker.createChild();
        ....
    }        
}

我想知道ChildMaker实例是否可以被垃圾收集。可以吗?

2 个答案:

答案 0 :(得分:2)

Java垃圾收集器非常复杂,并且喜欢相当自主地工作。你不能强迫它垃圾收集任何东西,你只能告诉它什么时候可以垃圾收集。

任何引用仍保存在程序中的对象(严格地说:通过任何仍然可以运行的线程)都不能被垃圾回收。还有别的。

我认为你问的是ChildMaker实例是否可以被垃圾收集,而Child仍被引用。严格地说,您提供的代码中不存在这样的位置。答案是肯定的;如果ChildMaker未被引用,那么即使仍然引用了Child,也可以对其进行垃圾回收,因为Child没有对ChildMaker的引用。

答案 1 :(得分:1)

答案取决于发生的事情

public getChild(){
    ChildMaker maker = new ChildMaker();
    Child c = maker.createChild();
    .... // here <-------- 
}       

如果重用变量maker,则它引用的对象是可访问的,因此不能进行垃圾回收。如果未重用maker,则该对象不再可访问,因此可以进行垃圾回收。

Java Language Specification

  

可到达对象是任何可以访问的任何对象   从任何实时线程继续计算。