JVM内存最大能调多大分析

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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分配内存大约是1.7G左右,不是2的32次方-1,我分配java 2G内存的计算机是IBM的RS6000.

经过不同平台的测试,我得出了大概的数值,win2k下1.6G左右,nt下1.2G,原因是这样的,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发放。

例如

rebase.exe -b 0x6D000000 \jdk\jre\bin\*.dll

\jdk\jre\bin\hotspot\jvm.dll这样你的JVM用的内存多一些,目前关于这个我只能得到BEA的 JRockit最大也只能使用1.8G内存,看来各家编译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)

1.85 GB - JRockit 5.0 R25.2 (SP2)

2.85 GB - JRockit 5.0 R26 (SP3)

Windows 2003/XP x64 Edition with a 32-bit JVM (64-bit OS)

2.05 GB - JRockit 5.0 R25.2 (SP2)

3.85 GB - JRockit 5.0 R26 (SP3)

对于windows 2000打开3G模式,windows核心编程说得很清楚,boot.ini 加入/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 4.0, Enterprise Edition

在我的机子测试一把,我的自己配置,1G内存,winXP

没有打开3G模式,sun的jdk 1.6 java -Xmx1447M -version,揪出错了,jrockit-,3G模式 sun的jdk没有变化,IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Windows XP x86-32 j9vmwi

4 (JIT enabled) 3G和2G相同,java -Xmx1787M -version 就出问题,jrockit-,注意Xmx的内存不是物理内存,我的机子物理内存只有1G。

jrockit不愧为java第一虚拟机,只可惜不开源。

今天分析了当前比较流行的几个不同公司不同版本JVM的最大内存,得出来的结果如下:公司 JVM版本最大内存(兆)client 最大内存(兆)server

SUN 1.5.x 1492 1520

SUN 2634 2660

SUN 1.4.2 1564 1564

SUN 1900 1260

IBM 2047 N/A

BEA JRockit 1.5 (U3) 1909 1902

除非特别说明,否则JVM版本都运行在Windows操作系统下

附:如何获得JVM的最大可用内存在命令行下用java -Xmx1200m

-XX:MaxPermSize=60m -version命令来进行测试,然后逐渐的增大XXXX的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息。最后得到的虚拟机实际分配到的总内存大小=堆内存+非堆内存1200m:为堆内存大小,如果不指定后者参数则有最大数限制,网上很多文章认为这就是JVM内存,-Xmx为设置最大堆内存

60m:为非堆内存大小,-XX:MaxPermSize实为永久域内存,在堆内存之外,属于非堆内存部分,jdk1.5我测了好像默认为62m,即得到非堆部分默认内存)Sun HotSpot ,它把堆分为三个主要的域:新域、旧域以及永久域。Sun JVM生成的所有新对象放在新域中。一旦对象经历了一定数量的垃圾收集循环后,便获得使

相关文档
最新文档