1
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”会打印到控制台。为什么我必须显式调用垃圾收集器?

4

1 回答 1

16

不保证在虚拟机退出时执行最终确定。没有显式的 GC,并且终结在也退出的专用线程中运行。解释链接:http: //download.oracle.com/javase/6/docs/api/java/lang/System.html#runFinalizersOnExit%28boolean%29

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

于 2011-02-26T09:12:21.017 回答