Java webstart max-heap-size导致JVM无法启动

问题描述 投票:0回答:2

我们在客户端使用 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 请注意,最大堆大小设置为 1024m 可能会在具有 2G 内存的机器上导致相同的问题。

基本上,我在这里寻找的是一些关于为什么会发生这种情况的参考/规范/经验,以及除了增加物理内存大小之外是否有任何解决此问题的方法。

另一件事是,如果我们不指定 max-heap-size,那么 max-heap-size 是使用实际的物理内存大小,还是使用系统默认的大小?

java jvm heap-memory java-web-start jnlp
2个回答
3
投票

这个问题很可能是因为你的JVM无法分配足够大的内存区域造成的。出于实现原因,Java 对象堆必须分配在连续的虚拟地址中。

我注意到,在具有 2 Gb RAM 的 Win XP 机器上,该内存会在 1.5 GB 左右中断(当然,这取决于每台 PC 上运行的进程,所以 YMMV)。

查看以下帖子以获得一些解释:

Windows XP 上的 Java 最大内存

为什么Java堆的最大大小是固定的?


1
投票

我发现 Mac 版本的 javaws 并没有很好地尊重初始堆大小和最大堆大小。我最终用这样的东西替换了它们:

      <j2se version="1.6+" java-vm-args="-Xmx1024m -Xms256m -Xss8m" />

最终让它在具有更大堆大小的 Mac 上运行

© www.soinside.com 2019 - 2024. All rights reserved.