トップ 差分 一覧 ソース 検索 ヘルプ 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 -- 初版

技術的雑談へ戻る

 突っ込み

name   comment  
URL (入力するとす ぱ むとみなします!)


技術的雑談へ戻る

TrackBack

TrackBack URL for this entry:
http://www.himajin2001.com/fswiki/tb.cgi/%B5%BB%BD%D1%C5%AA%BB%A8%C3%CC%2Dfinalize%28%29%A4%CE%B5%F3%C6%B0

技術的雑談へ戻る

最終更新日時:最終更新時間:2005年07月14日 10時07分12秒
トップページに戻る