最近、Swing アプリケーションを Webstart に変換しました。プロセスは非常に簡単でしたが、すべてのウィンドウを閉じた後、アプリケーションの JVM が終了しないことがわかりました。スレッド ダンプは、いくつかの非デーモン スレッド、特に Swing の EDT、AWT、およびいくつかの websart 関連のスレッドがあることを示しました。
使用される実際の戦略は、各ウィンドウが作成されるときにカウンターを増やし、閉じるときにカウンターを減らすというものです。デフォルトのクローズ操作は DISPOSE_ON_CLOSE です。カウンターがゼロになったら、すべてのスレッドプールを停止し、すべての JNI リソースを解放します。
Bat ファイル (同じ JAR) からアプリケーションを起動すると、すべてのウィンドウが閉じられたときに正常に終了したため、問題は Webstart に関係していると考えました。
今質問:
- 正確に何が起こっているのか誰か教えてもらえますか? Webstart がゾンビ JVM を残すのはなぜですか?
- JVM を停止せずに Webstart リソースを明示的に解放する方法はありますか?
- System.exit() を呼び出すと、リソースを解放せず、後でクリーンアップするために OS に依存するというずさんな慣行が助長されるという意見を常に持っていました (後でコードを再利用すると、厄介な驚きにつながる可能性があります)...私は何かを逃していますか?
アプリが Webstart によって起動されたかどうかを検出するためのフォローアップの質問も参照してください。