0

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

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

destroy()方法内部,他们处理他们获得的所有资源,然后获取对Runtime和调用的引用,runFinalization()并且gc()- 但它不执行 aSystem.exit()或等效操作。

问题

  1. 我知道这可以释放资源并使您留在同一个网页上,但是它对运行小程序的 JVM 有什么影响?
  2. System.exit()如果我在末尾添加一个调用,destroy()它将对瘦客户端服务器上运行的其他 JVM 做什么?
4

1 回答 1

0

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

要回答您的问题:

  1. 这取决于您的 Java 版本。从 Java 6 开始,更新 10(带有下一代插件)在一段时间没有运行 Java 的小程序后会自行关闭。随着过去一两年中 JVM 启动时间的减少,这个超时时间似乎变短了。
  2. 我不相信小程序(甚至签名的)被允许调用System.exit(). 但是,如果允许,在现代浏览器上,它将杀死该浏览器的 JVM 实例,而不会杀死其他浏览器。在过去,它可能会关闭整个浏览器:)

编辑:

实际上,答案 1 的故事还有更多……除了 OS X 之外的任何地方都是如此,下一代插件直到 6u27 左右才成为默认插件(在 10.6 上,它是用于 OS X 更新 5 的 Java,从当天开始是 10.7 1)。

于 2011-11-01T22:30:53.283 回答