Java webstart max-heap-size 导致JVM无法启动
Posted
技术标签:
【中文标题】Java webstart max-heap-size 导致JVM无法启动【英文标题】:Java webstart max-heap-size causes JVM cannot be started 【发布时间】:2011-03-18 04:29:34 【问题描述】:我们在客户端使用 java webstart 来实现基于 java swing 的应用程序。最近我们在点击 jnlp 链接时遇到了一个奇怪的“无法启动 java 虚拟机”错误。
我们很快就发现了,因为 jnlp 文件中的 max-heap-size 设置为 1024m,而大多数客户端 PC 只有 1 gb 物理内存。将 max-heap-size 设置回 512m 解决了这个问题。 目前,jnlp 文件中的相关行如下所示
<j2se version="1.5+" initial-heap-size="100m" max-heap-size="512m"/>
我查看了 jnlp 规范,但找不到与“Java 虚拟机”问题相关的任何内容。理论上,最大堆大小不应该像初始堆大小那么重要。但我们的经验却恰恰相反。
客户端环境:
Windows XP SP2(32 位),Internet Explorer 8.06,内存 1G 注意 max-heap-size 设置为 1024m 可能会在具有 2G ram 的机器上导致相同的问题。
基本上,我在这里寻找的是关于为什么会发生这种情况的一些参考/规范/经验,以及除了增加物理内存大小之外是否有任何解决此问题的方法。
另一件事是,如果我们不指定 max-heap-size,是使用实际物理内存大小作为 max-heap-size,还是使用系统默认大小?
谢谢, 杰森W
【问题讨论】:
【参考方案1】:这个问题很可能是由于无法为您的 JVM 分配足够大的内存区域造成的。出于实现原因,Java 对象堆必须分配在连续的虚拟地址中。
我注意到,在具有 2 Gb RAM 的 Win XP 机器上,它会在 1.5 GB 左右中断(当然,这取决于每台 PC 上运行的进程,所以 YMMV)。
查看以下帖子以获得一些解释:
Java maximum memory on Windows XP
Why is the maximum size of the Java heap fixed?
【讨论】:
非常有用的链接。谢谢。它仍然监督我,关于 jnlp max-heap-size 参数的要求什么都没有(至少我找不到任何东西)。【参考方案2】:我发现初始堆大小和最大堆大小都没有被 Mac 版本的 javaws 很好地尊重。我最终用这样的东西替换了它们:
<j2se version="1.6+" java-vm-args="-Xmx1024m -Xms256m -Xss8m" />
终于让它在具有更大堆大小的 Mac 上运行
【讨论】:
以上是关于Java webstart max-heap-size 导致JVM无法启动的主要内容,如果未能解决你的问题,请参考以下文章
Java WebStart 的 ClassNotFoundException
如何将 Java 9 '--permit-illegal-access' 标志传递给 Webstart 应用程序?
将Java Applet迁移到Java WebStart(JNLP)
如何在 Java WebStart (JNLP) 应用程序中获取多个 hprof 转储?