JVM内存最大能调多大分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JVM内存最大能调多大分析【经典】
2010-11-10 13:21
转载自
最终编辑
上次用weblogic 把 -XmxXXXX 设成2G,就启动不起来,设小点就起来了,当时很气,怎么2G都起不了,今天在看到了一篇解释,转过来了
这次一位老友提出了这个问题,记得当年一个java高手在blogjava提出后,被骂得半死。大家使用java -XmxXXXX -version版本得出了不同的结论。后来老友说大概是1800M左右,我当时反驳,“我设置过服务器8G内存,我使用两个tomcat,每个2G”。为此,我翻开所有的JVM的内存管理的c代码,没有任何结论。我不是linux内核程序员,但是我看过linux的源码,知道32位体系结构的计算机寻址空间是2^32=4G,intel Pentium Pro处理器寻址空间是36位,CPU内部增加了PAE寄存器。用于处理多出来的4根地址
线的使用,所以PAE的技术实现最大2^36=64G寻址。通过linux的内核源码,标准Linux内核对于物理内存的管理采用1:3的分配比例,即物理内存的1/4为内核空间(kernel space),剩下的3/4为用户进程空间(user space),因此,在一台4G内存的服务器上,用户进程可使用的内存最大也就是3G。当进程被内核调入CPU运行时,不同的地址空间数据会被调入4G以内的用户进程空间,其实就能用3G。 IA32架构上,单一进程是不能使用超过4G的内存空间的。但是我记得我给mysql server分配内存大约是左右,不是2的32次方-1,我分配java 2G内存的计算机是IBM的RS6000.
经过不同平台的测试,我得出了大概的数值,win2k下左右,nt下,原因是这样的,Classic VM and HotSpot VM 存放用户区的连续地址中,NT把 kernel DLLs 放在 0x7c 开头的地址空间,所以nt下只有<2G的空间,所以JVM heap 使用极限是2G.用户的dll开始于0x,用户的应用程序开始于0x00400000.我现在唯一确定的是sun可能为了防止和某些 JVM插件的冲突,把dll的地址给rebase一下,这样使用的空间就很少了一部分.为什末rebase,原因是这样的,因为在windows下编译 dll 的默认地址都是, 一般在release之前的时候要rebase一下,rebase 的-b 这个参数是指定一个起始地址,MSDN建议地址是0x,这个工具随visual studio和platform SDK发放。
例如
-b 0x6D000000 \jdk\jre\bin\*.dll \jdk\jre\bin\hotspot\这样你的JVM用的内存多一些,目前关于这个我只能得到BEA的 JRockit最大也只能使用内存,看来各家编译JDK时都作了些手脚.
目前只能得到bea的的-Xmx最小值是16 MB,sun的资料很不全,还好java开源了,可以不依靠sun了.
sun提供的资料
Maximum Address Space Per Process
Operating System Maximum Address Space Per Process
Redhat Linux 32
bit
2 GB
Redhat Linux 64
bit
3 GB
Windows
98/2000/NT/Me/XP
2 GB
Solaris x86 (32
bit)
4 GB
Solaris 32
bit
4 GB
Solaris 64
bit
Terabytes
以上文档有误,32位的redhat Server利用Highmem技术可以使用3G内存. solaris不愧是java的诞生平台。
问了一下bea的工程师,得出大致的结论,
Windows 2003/XP using the /3GB switch (32-bit OS)
GB - JRockit (SP2)
GB - JRockit R26 (SP3)
Windows 2003/XP x64 Edition with a 32-bit JVM (64-bit OS)
GB - JRockit (SP2)
GB - JRockit R26 (SP3)
对于windows 2000打开3G模式,windows核心编程说得很清楚,加入/3G参数。[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(2)\WINNT
[operating systems]
multi(0)disk(0)rdisk(0)partition(2)\WINNT="????" /3GB
Note: "????" in the previous example can be the programmatic name of any of the following operating system versions:
Windows XP Professional
Windows Server 2003
Windows Server 2003, Enterprise Edition
Windows Server 2003, Datacenter Edition
Windows 2000 Advanced Server
Windows 2000 Datacenter Server
Windows NT Server , Enterprise Edition
在我的机子测试一把,我的自己配置,1G内存,winXP
没有打开3G模式,sun的jdk java -Xmx1447M -version,揪出错了,为1911M,3G模式 sun的jdk没有变化,IBM J9 VM (build , J2RE IBM J9 Windows XP x86-32 j9vmwi
4 (JIT enabled) 3G和2G相同,java -Xmx1787M -version 就出问题,为2899M,注意Xmx的内存不是物理内存,我的机子物理内存只有1G。
jrockit不愧为java第一虚拟机,只可惜不开源。
今天分析了当前比较流行的几个不同公司不同版本JVM的最大内存,得出来的结果如下:
公司 JVM版本最大内存(兆)client 最大内存(兆)server
SUN 1492 1520
SUN 2634 2660
SUN 1564 1564