加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读