!!!技術的雑談-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 -- 初版 [[技術的雑談]]へ戻る !!突っ込み {{comment}} [[技術的雑談]]へ戻る {{trackback}} [[技術的雑談]]へ戻る