64位Windows上的32位JVM在启动时崩溃,使用-Xmx1300m和大量可用内存


文艺青年
2024-12-11 06:51:46 (2月前)
  1. 免费记忆。他关闭了一些申请(有


5G
</跨度>
免费记忆),但它仍然无法启动。报告给我的错误是:

在初始化vm期间发生错误
无法为物体预留足够的空间

6 条回复
  1. 0# 氷寒 | 2019-08-31 10-32



    我工作的应用程序需要尽可能多的内存。通过试验和错误我发现在Windows下,我可以可靠地分配给32位JVM的大约1200 MB。它略有不同但我从未知道它低于此值。在运行OpenJVM的Linux下,我有时可以分配1300MB。这个限制有很多原因,但是从我读到的内容中,阻止JVM获取更大堆的主要问题之一是要求堆是一个连续的内存块。



    由于您使用的是64位机器,运行64位操作系统,我强烈建议您只需切换到64位JVM。然后,您可以分配基本上无限量的内存。然而,我的实验表明,超过大约10GB的内存是一个收益递减的严重情况,因为JVM似乎没有很好地使用它并且性能受损。我相信Java 8将更好地管理大量内存。


  2. 1# AsuRa | 2019-08-31 10-32



    我同意以前的答案。只是几个额外的评论。是32位理论上可以访问4GB,但在Windows中,上半部分保留用于操作系统,下半部分用于所有应用程序。由于Windows将Java视为“用户”程序,而不是操作系统的一部分,因此您可以做的最好的是2GB。而在实践中,它远不如此。 1.2GB听起来不错。



    但是,在32位模式下运行时,我实际上建议下降到1024M。如果你绝对最大化堆空间,你可能遇到一个更严重的问题,你用完“本机内存”。如果您从未体验过这一点,那么这是一个真正的享受 - 因为整个JVM不会获得良好的Java堆栈跟踪,而是立即崩溃。



    我同意其他所有人需要咬紧牙关并增强应用程序以支持64位JVM。在我的例子中,我们有一个服务包装器,所以我们需要重新分配两个JVM,然后是一个32位服务包装器和一个64位服务包装器。然后,用户可以根据需要注册32位或64位版本。


  3. 2# 12345 | 2019-08-31 10-32



    这不是记忆问题,而是问题

    地址空间




    在理论上可由32位进程寻址的4 GB(2 ^ 32)上,必须考虑到OS内核需要该地址空间的一部分(显然该进程无法触及)的事实。



    当你使用Java时,地址空间

    java

    进程本身在堆,permgen,本机资源,JVM本身等之间进一步分裂。



    您使用的是64位操作系统。运行64位JVM。您的字节码(即所有罐子)将运行完全相同。没有理由使用32位JVM!


  4. 3# 哦哦了 | 2019-08-31 10-32



    为什么它不起作用?



    正如其他人所提到的,这个特定用户的计算机很可能在32位地址空间中没有足够大的连续JVM空闲内存块。最大32位堆空间与系统有关(请注意,操作系统和确切的JVM版本都有所不同)但在Windows上通常大约为1100-1600 MB。例如,在我的64位Windows 7系统上,这些是我安装的特定32位JVM版本的最大-Xmx大小:




    • Java 7:在1100米到1200米之间


    • Java 6:1400米到1500米之间


    • Java 5:1500米到1600米之间



    分配给进程的剩余内存由OS(或仿真器,对于64位主机上的32位进程),JVM本身以及JVM使用的其他结构使用。



    推荐的解决方案:将64位JVM与您的应用程序捆绑在一起



    如果无法让客户端安装64位JVM,请将其与应用程序捆绑在一起。 64位地址空间将具有大于1300 MB可用空间的连续内存块,即使没有足够大的连续可用物理内存块也是如此。



    如果您的软件是一个独立的应用程序,捆绑JVM是件小事。如果启动程序是applet,则可能必须让applet在启动应用程序之前检查已知位置的64位JVM(并在必要时下载)。



    不要忘记依赖关系



    如果您的应用程序使用32位本机库,请确保您还可以获得这些本机库的64位版本。



    如果您无法捆绑JVM或具有32位本机依赖项,​​该怎么办?



    你真的没有理由不能将JVM与你的应用程序捆绑在一起,但你可能有一些32位的本机依赖项没有被移植到64位 - 在这种情况下,它无关紧要是否捆绑了一个JVM,因为你仍然坚持使用32位。在这种情况下,您可以使启动程序执行二进制搜索,以通过重复执行来确定最大堆大小

    java -Xmx####m -version

    并解析输出(其中

    1. ####
    2. </code>
    3. 当然是Xmx值)。找到最大Xmx后,可以使用该值启动程序。 (注意:稍微更安全的选择是简单地尝试运行程序并检查堆空间错误,在每次尝试启动程序失败后减少Xmx。)



    如果您收到类似以下内容之一的错误消息,则需要使用较小的Xmx值:



    Java 7:




    1. 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.

    2. </code>


    Java 6:




    1. Error occurred during initialization of VM
      Could not reserve enough space for object heap
      Could not create the Java virtual machine.

    2. </code>


    Java 5:




    1. Error occurred during initialization of VM
      Could not reserve enough space for object heap
      Could not create the Java virtual machine.

    2. </code>


    但是如果你得到类似下面的东西,你知道你已经找到了最大值,或者你可以尝试更大的Xmx值:




    1. Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
      Java HotSpot(TM) Client VM (build 23.21-b01, mixed mode)

    2. </code>

  5. 4# 爱我真好 | 2019-08-31 10-32



    Windows XP限制为1.2 - 1.4 GB的连续内存。即使你有一个64位的JVM,32位仿真的工作方式与Windows XP的兼容性相同,即具有相同的限制。



    如果要使用更多内存,请运行64位JVM。除非你有32位的DLL,否则有一些小问题。


登录 后才能参与评论