Java - 在程序结束时对象不是“垃圾收集”?

时间:2011-02-26 09:04:59

标签: java garbage-collection finalize application-shutdown

public class Main {

    public static void main(String[] args) throws InterruptedException {
        ClassA a = new ClassA();
        a = null;

        //Runtime.getRuntime().gc();
        Thread.sleep(4000);
    }
}

public class ClassA {

    @Override
    public void finalize(){
        System.out.println("cleaned");
    }  
}

使用上面的代码,finalize()永远不会执行。控制台上没有任何内容。 从gc()中删除注释时,执行finalize()和 “已清理”将打印到控制台。 为什么我必须明确地调用垃圾收集器?

1 个答案:

答案 0 :(得分:16)

无法保证在虚拟机退出时执行终结。 没有明确的GC,终结是在一个也退出的专用线程中运行的。 链接到解释: http://download.oracle.com/javase/6/docs/api/java/lang/System.html#runFinalizersOnExit%28boolean%29

如果您需要清理代码,请使用:
Runtime.addShutdownHook http://download.oracle.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29