お問い合わせについて
jvm の終了時に何らかのクリーンアップを行いたい場合は、デーモン クラスの finalize メソッドをオーバーロードしてみませんか?
この記事から良い情報を見つけました
finalize()
ガベージ コレクターがオブジェクトを再利用する前に呼び出されます。JVM は、このメソッドがいつ呼び出されるかを保証しません。
finalize()
オブジェクトが finalize メソッドから復活した場合、GC スレッドによって 1 回だけ呼び出され、finalize が再度呼び出されることはありません。
アプリケーションには、ガベージ コレクションが呼び出されないライブ オブジェクトがいくつかある場合があります。
finalize メソッドによってスローされた例外は、GC スレッドによって無視されます
System.runFinalization(true)
およびRuntime.getRuntime().runFinalization(true)
メソッドは、メソッドを呼び出す可能性を高めますが、finalize()
これら 2 つのメソッドは非推奨になりました。これらのメソッドは、スレッドの安全性が欠如し、デッドロックが発生する可能性があるため、非常に危険です。
オラクルのドキュメントに従って、shutdownHooksに戻ります
public void addShutdownHook(Thread hook) 新しい仮想マシンのシャットダウン フックを登録します。
Java 仮想マシンは、次の 2 種類のイベントに応答してシャットダウンします。
- 最後の非デーモン スレッドが終了するか、exit (同等の System.exit) メソッドが呼び出されると、プログラムは正常に終了します。
- 仮想マシンは、^C の入力などのユーザー割り込み、またはユーザー ログオフやシステム シャットダウンなどのシステム全体のイベントに応答して終了します。
- 仮想マシンがシャットダウン シーケンスを開始すると、登録されているすべてのシャットダウン フックが不特定の順序で開始され、同時に実行されます。finalization-on-exit が有効になっている場合、すべてのフックが終了すると、呼び出されていないすべてのファイナライザーが実行されます。
- 最後に、仮想マシンが停止します。exit メソッドの呼び出しによってシャットダウンが開始された場合、非デーモン スレッドと同様に、デーモン スレッドはシャットダウン シーケンス中も実行し続けることに注意してください。
しかし、オラクルのドキュメントでさえそれを引用しています
シャットダウン フックもすばやく作業を終了する必要があります。プログラムが exit を呼び出すと、仮想マシンがすぐにシャットダウンして終了することが期待されます。
まれに、仮想マシンが異常終了する場合があります。つまり、正常にシャットダウンせずに実行を停止する場合があります。
これら両方のアプローチの欠点を考慮すると、以下のアプローチに従う必要があります
アプリケーションの重要なリソースに依存しfinalize()
たりshutdown hooks
、解放したりしないでください。
ブロックを適切に使用try{} catch{} finally{}
し、重要なリソースを finally(}
ブロックで解放します。finally{}
ブロック、キャッチ、Exception
およびThrowable
.