トップ 一覧 検索 ヘルプ RSS ログイン

技術的雑談-finalize()の挙動の変更点

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

[[技術的雑談]]へ戻る