总听说32bit 系统中进程最大内存2G 类似的话,今天花了点时间来求证下,目前还有不完整的情况,后续补充。
首先说32位,这个概念最早应该是从CPU来的。通常32位CPU最大支持2^32Bytes内存也就是4GB,不过较新的CPU一般支持PAE模式,启用PAE模式理论上可以支持64GB的内存。
不过仅仅CPU支持是不行的,还需要操作系统支持。操作系统也有32位,64位之分。而且一般情况下32位操作系统最大内存是4G,比如我们的通常使用的XP,vista,win7,有些企业版本,比如带Server ,Enterprice ,Datacenter字样的特殊版本内存通常会大很多。
linux2.3.23之前也是4G,之后的版本支持PAE了,所以理论上都是64GB。如果想你的系统支持内存大于4G需要自己开启PAE。
既然32位系统最大支持内存是4G,为什么我们编程的时候是2G呢,这个跟操作系统有关系了。
对微软的系统来说,操作系统将内存分为两部分,一部分给操作系统使用的,一部分给除操作系统之外的应用程序使用的。
默认情况下两部分都是2GB,(2000-2003,都会有个boot.ini)文件可以设置这个值。win7里没有这个文件了,但是可以通过bcdedit命令来设置。
对于linux系统来说,这个比例是1:3,3GB是给用户进程使用的,因此在linux下应用程序的最大内存是3GB,当然也是可以设置的,好像需要从新编译内核。
接下来我用32位的window7系统来测试JAVA最大内存的情况。
首先了解系统默认的虚拟机参数
-Xms 初始堆大小 物理内存的1/64
-Xmx 最大堆大小 物理内存的1/4
-XX:MaxPermSize 设置持久代最大值 物理内存的1/4
-Xss 每个线程的堆栈大小 JDK5.0后每个大小为1M,之前为256K,减少这个值能够创建更多的线程。
1,修改-Xmx1600m 其它默认可以运行
2,修改-Xmx1650m 其它默认不可以运行 (失败)
3,修改-Xmx1600m -XX:MaxPermSize=80m 可以运行
4,修改-Xmx1600m -XX:MaxPermSize=90m 不可以运行 (失败)
5,修改-Xmx680m -XX:MaxPermSize=1000m 可以运行
6,修改-Xmx690m -XX:MaxPermSize=1000m 不可以运行 (失败)
所以为了安全,通常两个Xmx 和MaxPermSize 之和<1500m