2008-10-17 59 views
8

最近我将Swing应用程序转换为Webstart。这个过程非常简单,但是我发现关闭所有窗口后,我的应用程序的JVM没有终止。线程转储表明有几个非守护线程,特别是Swing的EDT,AWT和一些websart相关的线程。我是否必须在Webstart应用程序中显式调用System.exit()?

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

当我推出从一个bat文件(相同的JAR文件)的应用程序,它终止罚款时,所有的窗口都关闭了,所以我想,这个问题有事情做与Webstart的。

现在的问题:

  1. 谁能告诉我究竟是怎么回事?为什么Webstart会留下僵尸JVM?
  2. 有没有一种方法可以在不停止JVM的情况下显式释放Webstart资源?
  3. 我一直有这样的调用System.exit()鼓励不释放你的资源,并依托OS之后进行清理(如果以后重用代码,这可能会导致危险的意外情况)上的草率做法的意见我错过了什么吗?

另请参阅followup question以检测该应用是否已由Webstart启动。

回答

6

由于WebStart中的错误,是的。 WebStart启动一个“安全线程”,以达到与EDT交互的目的。这个SecureThread可以防止在处理所有窗口和AWT资源时所期望的Java进程的自动终止。

欲了解更多信息,请参阅http://www.pushing-pixels.org/?p=232

+0

谢谢,链接解释了我想知道的一切。有没有我可以投票的错误游行票? (如果是,请将回复作为对主要问题的评论发布) – ddimitrov 2008-10-18 02:20:13

0

Webstart的启动控制台窗口(您可能能够禁用)。控制台窗口用于查看webstart进程的stdout/err以及基本的日志/调试,但具有创建顶级AWT/Swing窗口的副作用。由于AWT/EDT仅在LAST窗口处理完毕时结束,因此控制台窗口将阻止您的应用程序。你或许应该调用System.exit()100%确保您的应用程序退出(除非你能出示担保一定的客户端配置,在webstart控制台关闭)

+0

nope。默认配置是没有控制台窗口。屏幕上没有任何窗口(空白任务栏,alt + esc不会做任何事情) – ddimitrov 2008-10-17 13:30:02

1

的AWT EDT通常是罪魁祸首。几年以来,当没有未处理的窗户时,它已经有了一些关闭的逻辑。然而,泄漏问题经常出现,包括AWT和Swing的实施。因此,我强烈建议在生产版本中使用System.exit(您可能希望将其留给某些测试以检测泄漏)。

的Webstart的线程都应该是守护进程时,没有系统的窗口(控制台,javax.jnlp服务和其它对话框)显示。

+0

您可以举例说明Swing中的泄漏(即分配无法使用公共API释放的资源)吗? – ddimitrov 2008-10-17 13:28:08

0

考虑与JConsole的连接,并获得一起来看看哪些JVM在做什么。

0

我遇到与web启动相同的问题。如果我关闭java控制台,进程不会挂断。 Sun提供的任何已知Bug ID?

相关问题