为什么它不起作用?
正如其他人所提到的,这个特定用户的计算机很可能在 32 位地址空间中没有足够大的连续空闲内存块供 JVM 使用。最大 32 位堆空间取决于系统(请注意,操作系统和确切的 JVM 版本都会有所不同),但在 Windows 上通常约为 1100-1600 MB。例如,在我的 64 位 Windows 7 系统上,这些是我安装的特定 32 位 JVM 版本的最大 -Xmx 大小:
- Java 7:在 1100m 和 1200m 之间
- Java 6:1400m 到 1500m 之间
- Java 5:1500m 到 1600m 之间
分配给进程的剩余内存由操作系统(或模拟器,在 64 位主机上的 32 位进程的情况下)、JVM 本身以及 JVM 使用的其他结构使用。
推荐的解决方案:将 64 位 JVM 与您的应用程序捆绑在一起
如果您无法让客户端安装 64 位 JVM,请将其与您的应用程序捆绑在一起。64 位地址空间将有一个大于 1300 MB 可用的连续内存块,即使不一定有足够大的连续物理内存块可用。
如果您的软件是一个独立的应用程序,那么捆绑 JVM 是小菜一碟。如果启动器是一个小程序,那么在启动应用程序之前,您可能必须让您的小程序检查已知位置的 64 位 JVM(并在必要时下载它)。
不要忘记依赖关系
如果您的应用程序使用 32 位本机库,请确保您也可以获得这些本机库的 64 位版本。
如果您无法捆绑 JVM 或具有 32 位本机依赖项怎么办?
您确实没有理由不能将 JVM 与您的应用程序捆绑在一起,但您可能有一些 32 位本机依赖项尚未移植到 64 位——在这种情况下,这无关紧要您是否捆绑了 JVM,因为您仍然坚持使用 32 位。java -Xmx####m -version
在这种情况下,您可以通过重复执行和解析输出(####
当然,Xmx 值在哪里) ,让您的启动器执行二进制搜索以确定最大堆大小。找到最大 Xmx 后,您可以使用该值启动程序。(注意:稍微安全一点的选择是简单地尝试运行程序并检查堆空间错误,在每次尝试启动程序失败后减少 Xmx。)
如果您收到如下错误消息之一,则需要使用较小的 Xmx 值:
爪哇 7:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
爪哇 6:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
爪哇 5:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
但是如果你得到类似下面的东西,你知道你已经找到了最大值,或者你可以尝试一个更大的 Xmx 值:
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) Client VM (build 23.21-b01, mixed mode)