まず、アプリケーションを終了しますか、それとも強制的に終了しますか? (停止ボタンを使用して) 強制的に終了している場合、このEclipse バグ レポートには、これが機能しない可能性がある理由の詳細が記載されています。
それができない場合は、これが Windows 固有の動作であることについて正しいかもしれません。Macなので確認できません、すみません。ただし、次のテスト プログラムでは、シャットダウン フックが期待どおりに実行されることがわかります。
public class MyShutdownHook
{
public static void main( String[] args )
{
System.out.println( "Entering main." );
Runtime.getRuntime().addShutdownHook(
new Thread(
new Runnable() {
public void run() {
System.out.println( "Shutdown hook ran." );
}
}
)
);
System.out.println( "Exiting main." );
}
}
Runtime#addShutdownHookの Javadoc には、JVM が正常に終了せずに中止された場合にシャットダウン フックが実行されないことが記載されているため、おそらく想定は正しいでしょう。そうは言っても、試してみるべきことがいくつかあります。繰り返しますが、申し訳ありませんが、これらを事前に確認することはできません。ここには Windows はありません。(幸いなことに!)
- JVM に-Xrsオプションが含まれていないことを確認してください。これは、シャットダウン フックに副作用があります。
- -serverまたは-clientオプションを使用して JVM を起動してみてください。VM モードの選択によってエッジケースの動作が影響を受ける可能性があることは、私の経験から言えます。(特にスレッドに関して -- 少なくとも Mac では。)
- プロファイラーなどでアプリを起動していますか? ネイティブ ライブラリをロードしていますか?
- 致命的なエラーが発生し、見逃していませんか? たとえば、OutOfMemoryError などですか?
- Eclipse でアプリケーションの[実行構成] ダイアログから [バックグラウンドで起動] オプションをオンまたはオフにしてみてください。
- 最後になりましたが、機会があればSystem.exit()を手動で呼び出してください。:)