正确关闭applet

时间:2011-11-01 22:24:41

标签: java garbage-collection applet jvm next-generation-plugin

在我工作的地方,当用户注销我们的应用程序(一个applet)时,他们使用AppletContext.showDocument(URL)方法,提供所需的注销JSP。但他们也有代码说,如果由于某种原因他们无法让AppletContext只是调用Applet.destroy()方法。

我们正在使用瘦客户端架构,这意味着我们基本上有一堆连接到服务器的哑终端。我之所以提到这一点是因为我们经常会有几十个(如果不是100个)JVM实例运行 - 每个applet一个。

destroy()方法中,他们会处置他们获取的所有资源,然后获得对Runtime的引用并致电runFinalization()gc() - 但它不会执行{ {1}}或同等的。

问题

  1. 我明白释放资源并让你在同一个网页上,但它对运行applet的JVM有什么影响?
  2. 如果我在System.exit()末尾添加对System.exit()的调用,它会对瘦客户端服务器上运行的其他JVM做些什么?

1 个答案:

答案 0 :(得分:0)

对于上下文,这是必要的,因为当页面处于活动状态时,浏览器(或Java插件或两者)会挂起到您的applet实例。即使您从DOM中删除它或尝试其他技巧来释放该内存,直到您导航到另一个页面,您的applet实例将被保留,因此您需要在destroy()中完全清理。我已经完成了内存分析,显示它在某处的本机代码中被引用。

回答你的问题:

  1. 这取决于您的Java版本。从Java 6更新10(使用下一代插件)经过一段时间没有运行Java的applet将自行关闭。随着JVM启动时间在过去一两年内减少,此超时似乎变得更短。
  2. 我不相信applet(甚至是已签名的)可以拨打System.exit()。如果它被允许,在现代浏览器上它会杀死该浏览器的JVM实例,而不是其他浏览器。在过去,它可能会关闭整个浏览器:)
  3. 编辑:

    实际上,答案1的故事还有更多......除了OS X之外,其他地方都是如此,其中下一代插件在6u27左右不是默认值(在10.6上,它是用于OS X更新5的Java,以及从第1天起10.7。