- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!技術的雑談-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}}
[[技術的雑談]]へ戻る