在具有 12GB RAM 和 33GB 虚拟内存(每个任务管理器)的 64 位 Windows 机器上,我能够运行 Java (1.6.0_03-b05),并且不可能将 -Xmx 设置为 3.5TB,但它35TB 失败。它何时起作用以及何时失败背后的逻辑是什么? 35TB 的错误似乎暗示它试图在启动时保留空间。为什么它会为 -Xmx(而不是 -Xms)这样做?
C:\temp>java -Xmx3500g ostest os.arch=amd64 13781729280 Bytes RAM C:\temp>java -Xmx35000g ostest Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine.
在 Solaris(4GB RAM,Java 1.5.0_16)上,我几乎放弃了 1 PB 的设置 -Xmx。我不明白它何时会在 -Xmx 设置上出错的逻辑。
devsun1.mgo:/export/home/mgo> java -d64 -Xmx1000000g ostest os.arch=sparcv9 4294967296 Bytes RAM
最佳答案
至少对于 Windows 的 Sun 64 位 VM 1.6.0_17,ObjectStartArray::initialize 会在 VM 启动时为每 512 字节的堆分配 1 字节。使用 35TB 堆启动 VM 将导致 VM 立即分配 70GB,因此在您的系统上失败。
Sun 的 32 位 VM(我想是 64 位 VM)在计算最大堆时不考虑可用物理内存,但仅受 Windows 和 Linux 上的 2GB 可寻址内存或 4GB 的限制在 Solaris 上,或者可能无法在启动时为管理区域分配足够的内存。
如果您考虑一下,根据可用物理内存检查最大堆值的合理性并没有多大意义。 X GB 的物理内存并不意味着 X GB 在需要时可供 VM 使用,它也可以被其他进程使用,因此 VM 需要一种方法来应对需要的堆多于可用堆的情况无论如何操作系统。如果 VM 未损坏,如果无法从操作系统分配内存,则会抛出 OutOfMemoryErrors,就像已达到最大堆大小一样。
关于java - 为什么我可以将 -Xmx 设置为大于 Windows 和 Solaris 机器上的物理和虚拟内存的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1949904/