java – 为什么我能够在Windows和Solaris上将-Xmx设置为大于物理
发布时间:2020-12-14 05:43:47 所属栏目:Java 来源:网络整理
导读:在具有12GB RAM和33GB虚拟内存的64位 Windows机器上(每个任务管理器),我能够以不可能的-Xmx设置3.5TB运行 Java(1.6.0_03-b05)但是它失败了35TB .当它工作和失败时,背后的逻辑是什么? 35TB的错误似乎意味着它试图在启动时保留空间.为什么它会为-Xmx(而不是-X
在具有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,就像已达到最大堆大小一样. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |