最近我将 Swing 应用程序转换为 Webstart。该过程非常简单,但我发现在关闭所有窗口后,我的应用程序的 JVM 并未终止。线程转储显示有几个非守护线程,特别是 Swing 的 EDT、AWT 和几个与 websart 相关的线程。
实际使用的策略是每个窗口在创建时增加一个计数器,在关闭时减少一个计数器。默认关闭操作是DISPOSE_ON_CLOSE。当计数器达到零时,我停止所有线程池并释放所有 JNI 资源。
当我从 bat 文件(相同的 JAR)启动应用程序时,当所有窗口都关闭时它会正常终止,所以我认为问题与 Webstart 有关。
现在的问题是:
- 谁能告诉我到底发生了什么?为什么 Webstart 会留下僵尸 JVM?
- 有没有办法在不停止 JVM 的情况下显式释放 Webstart 资源?
- 我一直认为,调用 System.exit() 会鼓励不释放资源并依赖操作系统在您之后进行清理的草率做法(如果您稍后重用代码,这可能会导致令人讨厌的意外)...我错过了什么吗?
另请参阅跟进问题用于检测应用程序是否已由 Webstart 启动。
因为 WebStart 中的错误,是的。 WebStart 出于其自身目的启动一个“安全线程”,与 EDT 进行交互。当所有窗口和 AWT 资源都被释放时,该 SecureThread 可以防止 Java 进程自动终止。
欲了解更多信息,请参阅http://www.pushing-pixels.org/?p=232
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)