Java对象在程序结束时不是“垃圾收集”的吗?
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 楼答案
不能保证在虚拟机退出时执行终结。 没有显式的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