重複の可能性:
メソッドのファイナライズと例外
ガベージコレクタはfinalize()
、オブジェクトがメモリから解放されようとしているときにメソッドを呼び出します。finalize()
メソッドで例外が発生するとどうなりますか?
GCはさらに進んでメモリを解放しますか、それともGCはそのオブジェクトのプロセスを停止しますか?
重複の可能性:
メソッドのファイナライズと例外
ガベージコレクタはfinalize()
、オブジェクトがメモリから解放されようとしているときにメソッドを呼び出します。finalize()
メソッドで例外が発生するとどうなりますか?
GCはさらに進んでメモリを解放しますか、それともGCはそのオブジェクトのプロセスを停止しますか?
try-catchステートメントで例外が発生し、正しくキャッチされた場合は、通常のプログラムの場合と同様に、「GCはさらに続行します」と答えます。
しかし、スローされた例外が処理されない場合、JSLによると、
ファイナライズ中にキャッチされなかった例外がスローされた場合、例外は無視され、そのオブジェクトのファイナライズは終了します。
したがって、この場合、「GCはそのオブジェクトのプロセスを停止します」。この場合、一部のリソースが正しく解放されていない可能性があります。
ちなみに、ファイナライザーには2つの欠点があります。
finalizeメソッドが実行されるかどうかはわかりません(このブログから)
ガベージコレクターがオブジェクトに関連付けられたメモリを解放する前に常にfinalizeを呼び出す場合、上記の理由は何ですか?その理由は、ガベージコレクターが、JVMが終了する前にオブジェクトをクリーンアップする機会を常に取得できるとは限らないためです。
ファイナライザーは、オブジェクトを古いスペースに昇格させ(収集に時間がかかります)、ファイナライザーが実行されるまでGCを延期し、GCアルゴリズムにオーバーヘッドを追加します。(Javaパフォーマンスチューニング2nd、Jack Shiraziによるエディションを参照)。
「finalizeメソッドによってスローされた例外により、このオブジェクトのファイナライズは停止されますが、それ以外の場合は無視されます。」 http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#finalize()