使用separate_jvm在单独的JVM中启动小程序并不总是有效。

3

我有一个小程序,它占用了相当多的内存,因此我们想要使用separate_jvm = true启动它,以便每个实例都获得自己的JVM(而不是共享一个JVM),这样我们在重复调用时就不会耗尽内存。这在我们的开发环境中可以运行,但在客户的计算机上失败了。

这是否有安全原因?

这是一个签名和可信任的小程序,因为我们正在进行3D渲染。


你的客户使用的JRE版本是哪个? - Vineet Reynolds
他们正在使用1.6.0_14-b08和1.6.0_15-b03。 - oconnor0
2个回答

8
我会假定你的客户端电脑上已经安装了Sun Java 6更新10。如果没有,你可能可以强制应用程序在至少6u10版本的JVM中运行。我不确定将抛出什么错误或者如果找不到所需的JVM版本会显示什么错误消息。
除此之外,在APPLET标签中指定separate_jvm参数时,并不能保证会创建单独的JVM实例。
唯一的保证是APPLET将在其自己的JVM中运行,与其他APPLET分开。如果已经有JVM可用,并且没有在该JVM中加载任何APPLET,则可能会使该JVM在已初始化的JVM实例中加载APPLET。
对于Sun Java 6 u10的发行说明,以下几点值得阅读:
这里是6u10发布说明中关于共享和创建新JVM实例的大致指南:
  • 如果用于启动现有JVM实例的命令行参数是请求参数的超集,则将使用现有的JVM实例。
  • 如果为“默认”命令行参数集(即在Java控制面板中指定的那些,没有指定java_arguments)启动JVM实例,则此JVM实例永远不会用于启动任何通过java_arguments指定了至少一个命令行参数的小程序。
  • -Xmx被特殊处理:如果通过java_arguments启动了一个已存在的JVM实例,例如-Xmx256m,并且一个新的小程序请求-Xmx128m,则新的小程序很可能在现有的JVM实例中运行。换句话说,-Xmx规范与大于或等于测试相匹配。
因此,最好在小程序标记中提供java_arguments,以便非常有可能在单独的JVM中启动小程序。

唯一的保证是小程序将在其自己的JVM中运行,与其他小程序分开。这就是被打破的保证。我们曾经让它们启动两个同时运行的实例,并且它们都记录到同一个Java控制台(这在我们的开发环境中没有做到,每个实例都有自己的控制台)。 - oconnor0
你是使用applet标签还是object标签来嵌入页面中的applet? - Vineet Reynolds
1
我想要的是相反的,我想在Java 7中将separate_jvm设置为false,但是在页面刷新后会打开一个新的控制台,这样就会启动一个新的JVM,对吗?问题在于它停止了与调试器的连接,并迫使我重新启动浏览器以允许我的IDE再次连接以调试小应用程序...并且我被迫使用Java控制面板中的默认Java参数,因为那里有允许调试的参数...这在Java 6.10+中没有发生...为什么在Java 7中会改变呢?开发Java小应用程序和JS混合变得更加困难。 - Jaime Hablutzel

2

separate_jvm 参数是在 1.6u10 版本中引入的。如果您客户所使用的 JVM 版本早于此版本,该参数将被静默忽略。


没错,他们使用的是1.6u11或13版本,我记不清了。 - oconnor0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接