java – 为什么我能够在Windows和Solaris上将-Xmx设置为大于物理和虚拟内存的值?

前端之家收集整理的这篇文章主要介绍了java – 为什么我能够在Windows和Solaris上将-Xmx设置为大于物理和虚拟内存的值?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在具有12GB RAM和33GB虚拟内存的64位 Windows机器上(每个任务管理器),我能够以不可能的-Xmx设置3.5TB运行 Java(1.6.0_03-b05)但是它失败了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可寻址内存或Solaris上的4GB或可能无法在启动时为管理区域分配足够的内存.

如果你考虑一下,检查最大堆值对可用物理内存的完整性没有多大意义. X GB的物理内存并不意味着X GB在需要时可用于VM,它也可以被其他进程使用,因此VM需要一种方法来应对需要比从无论如何操作系统.如果VM未中断,则如果无法从OS分配内存,则抛出OutOfMemoryErrors,就像已达到最大堆大小一样.

猜你在找的Java相关文章