在具有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,就像已达到最大堆大小一样.