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

标签 java

在具有 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/

相关文章:

java - 我无法在 Ubuntu 服务器上发送电子邮件 [javax.net.ssl.SSLHandshakeException]

java - HSSFWorkbook java.lang.IllegalArgumentException : No more than 3 rules may be specified

java - Maven 会下载一个新的 SNAPSHOT jar 来替换刚刚在同一构建中创建的 jar 吗?

java - 如何将子列表中的值设置为父列表

Java:从多部分 POST 请求获取视频文件

java - 从 jar 为类文件生成 jaxb Xsd 模式

java - 使用特定的try catch,错误覆盖

java - 当我使用 proguard 生成发布 APK 时,出现错误

java - 查找 JVM 崩溃的原因

java - 如何初始化我的通用数组?