gpt4 book ai didi

java - 为什么我可以将 -Xmx 设置为大于 Windows 和 Solaris 机器上的物理和虚拟内存的值?

转载 作者:搜寻专家 更新时间:2023-10-30 21:44:57 25 4
gpt4 key购买 nike

在具有 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 RAMC:\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 ostestos.arch=sparcv94294967296 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com