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(),并且 “cleaned”被打印到控制台。 为什么我必须显式调用垃圾收集器?
最佳答案
不保证在虚拟机退出时执行终结。 没有明确的 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
关于Java - 程序末尾的对象不是 "garbage collected"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5125998/