最近,我将Swing应用程序转换为Webstart。这个过程非常简单,但是我发现在关闭所有窗口之后,我的应用程序的JVM并未终止。线程转储显示有两个非守护程序线程,特别是Swing的EDT,AWT和几个与Websart相关的线程。

实际使用的策略是,每个窗口在创建时都会增加一个计数器,在关闭时会减少一个计数器。默认关闭操作为DISPOSE_ON_CLOSE。当计数器达到零时,我停止所有线程池并释放所有JNI资源。

当我从bat文件(相同的JAR)启动应用程序时,当所有窗口都关闭时,它可以正常终止,因此我认为问题与Webstart有关。

现在的问题:

  • 有人可以告诉我到底发生了什么吗?为什么Webstart会留下僵尸JVM?
  • 是否可以在不停止JVM的情况下显式释放Webstart资源?
  • 我一直认为,调用System.exit()会鼓励您在不释放资源并依靠OS进行清理后再进行草率的操作(如果以后再使用代码,可能会导致令人讨厌的意外)。我错过了什么吗?

  • 另请参阅followup question,以检测Webstart是否已启动该应用程序。

    最佳答案

    因为WebStart中的错误,所以可以。 WebStart出于与EDT交互的目的而启动了一个“安全线程”。当处理完所有窗口和AWT资源后,此SecureThread会防止Java进程自动终止。

    有关更多信息,请参见http://www.pushing-pixels.org/?p=232

    10-08 01:23