java进程使用的最大内存的数值

来源:互联网 发布:淘宝天使心写真集原版 编辑:程序博客网 时间:2024/06/07 03:30
这次一位老友提出了这个问题,记得当年一个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开始于0x77000000,用户的应用程序开始于 0x00400000.我现在唯一确定的是sun可能为了防止和某些JVM插件的冲突,把dll的地址给rebase一下,这样使用的空间就很少了一部 分.为什末rebase,原因是这样的,因为在windows下编译 dll 的默认地址都是10000000, 一般在release之前的时候要 rebase一下,rebase 的 -b 这个参数是指定一个起始地址,MSDN建议地址是0x60000000,这个工具随 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-R27.1.0- jdk1.5.0_08为1911M,3G模式 sun的jdk没有变化,IBM J9 VM (build 2.3,  J2RE 1.5.0 IBM J9 2.3 Windows XP x86-32 j9vmwi3223-2006050
4 (JIT enabled) 3G和2G相同,java -Xmx1787M -version 就出问题,jrockit-R27.1.0-jdk1.5.0_08为2899M,注意Xmx的内存不是物理内存,我的机子物理内存只有1G
jrockit不愧为java第一虚拟机,只可惜不开源。
原创粉丝点击