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

コードのクリーンアップが必要な場合:
Runtime.addShutdownHook http://download.oracle.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29

于 2011-02-26T09:12:21.017 に答える