垃圾收集器意外输出

时间:2014-05-25 20:45:43

标签: java garbage-collection runtime output println

我无法理解这里发生的事情

public class UnderstandGC {
public class Inner1
{
    String name=new Inner2().name;
    public void finalize()
    {
        System.out.println("Inner1 -> I am Dead");
    }
}
public class Inner2
{
    public String name="Inner2";
    public void finalize()
    {
        System.out.println("Inner2 -> I am Dead");
    }
}
public void finalize()
{
    System.out.println("Main -> I am Dead");
}
    public static void main(String[] args) {
        UnderstandGC ugc=new UnderstandGC();
Inner1 inner1=ugc.new Inner1();
//System.out.println("hello");      //1

Runtime.getRuntime().gc();         


    }
}

预期产量: 在Inner1中实例化为字段引用的Inner2的Inner2 -> I am Dead bcoz对象没有来自主线程运行时堆栈的本地引用。

观察到的输出:没有

有趣的观察是,如果我在我的代码中包含评论//1,它可以正常工作。无法理解发生了什么。

2 个答案:

答案 0 :(得分:1)

gc() method javadoc

  

调用此方法表明Java虚拟机消耗   努力回收未使用的物体以制造记忆   它们目前可以快速重复使用。

无论如何都无法保证它会运行GC。

答案 1 :(得分:0)

通过添加以下

进行测试
    Runtime.getRuntime().gc();     
    for(int i=0;i<25000;i++){

    }

在我的JVM上,循环上任何小于25000的东西,都没有调用gc,它似乎甚至没有给JVM调用gc的机会,即使它也是如此。我推测,在应用程序结束之前,System.out.println给JVM足够的时间来调用gc(再次,只有在需要的时候才能保证)。