最近我将一个 Swing 应用程序转换为 Webstart。这个过程非常简单,但我发现在我关闭所有窗口后,我的应用程序的 JVM 并没有终止。线程转储显示有几个非守护线程,特别是 Swing 的 EDT、AWT 和几个 websart 相关线程。
实际使用的策略是每个窗口在创建时递增一个计数器,在关闭时递减一个。默认关闭操作是 DISPOSE_ON_CLOSE。当计数器达到零时,我停止所有线程池并释放所有 JNI 资源。
当我从 bat 文件(相同的 JAR)启动应用程序时,它在所有窗口都关闭时正常终止,所以我认为问题与 Webstart 有关。
现在的问题:
- 谁能告诉我到底发生了什么?为什么 Webstart 会留下僵尸 JVM?
- 有没有办法在不停止 JVM 的情况下显式释放 Webstart 资源?
- 我一直认为调用 System.exit() 会鼓励草率的做法,即不释放您的资源并依赖操作系统在您之后进行清理(如果您稍后重用代码,这可能会导致令人讨厌的意外)......我错过了什么吗?
另请参阅后续问题以检测 Webstart 是否已启动该应用程序。