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()和 “已清理”将打印到控制台。 为什么我必须明确地调用垃圾收集器?
答案 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