Java - 程序末尾的对象不是 "garbage collected"吗?

标签 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(),并且 “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/

相关文章:

java - 优化改组 ArrayList

java - 为什么导入 javax.swing.* 而不是 java.swing.*

java - 如何在 Spring boot 1.5.2 中终止 Hibernates 数据库连接?

ada - 如何引发对 Finalize 的多次调用?

java - 在 Java 中,如何检查 AutoCloseable.close() 是否已被调用?

java - 如何在运行时从 jar 文件调用方法

c# - 对象完成但尚未收集垃圾时的弱引用行为

java - 安卓 5 : No more Garbage Collection message?

java - 如果我让字符串引用转义,这会阻止包含对象被垃圾收集吗?

c# - 析构函数、处理方法和终结方法之间的区别