技術的雑談-finalize()の挙動
環境
JDK1.4.2_08とJDK1.5.0_03
現象
java.lang.Object#finalize()はC++でのデストラクタにあたるメソッドです。
規格上は「VMのgc(ガベージコレクト:不要オブジェクトのクリーンナップ)時に不要なオブジェクトに対して呼ばれる」とありますが、結構いい加減です。
特に、Buffer系Writerをオブジェクトのコンストラクタなどでcreateし、オブジェクトの破棄時に自動的にcloseさせようとしたりするとBuffer内部のデータが」flushされずに一緒に消えてくれたりします。
対処
これを防ぐには「close()」とか「flush()」とかいうメソッドを作って「オブジェクト廃棄時に必ず呼ぶようにCodingすること!」というのがBetterです。
これができない時はアプリの終了動作として以下のコードを入れておきましょう。
#アプリ終了ルーチン { 〜 // flushさせたいオブジェクトをnullにし、他からの参照を切る。 Buffer持ったオブジェクト = null; // 明示的にJava VMにgcさせる。 System.gc(); // アプリ終了 Syetem.exit(0); }
これ、どうもJava 1.2ぐらいの時からのBugっぽいです。
ってか、「Runtimeが自動的にガベージコレクトを行う」っていうJavaの「仕様」なのか??
履歴
2005/7/14 -- 初版
技術的雑談へ戻る