本站首页    管理页面    写新日志    退出


«December 2025»
123456
78910111213
14151617181920
21222324252627
28293031


公告

戒除浮躁,读好书,交益友


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:邢红瑞的blog
日志总数:523
评论数量:1142
留言数量:0
访问次数:9748032
建立时间:2004年12月20日




[jvm]java进程使用的最大内存的数值
原创空间,  软件技术,  电脑与网络

邢红瑞 发表于 2007/4/13 20:23:53

这次一位老友提出了这个问题,记得当年一个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=30default=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 ProfessionalWindows Server 2003Windows Server 2003, Enterprise EditionWindows Server 2003, Datacenter EditionWindows 2000 Advanced ServerWindows 2000 Datacenter ServerWindows 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-20060504 (JIT enabled) 3G和2G相同,java -Xmx1787M -version 就出问题,jrockit-R27.1.0-jdk1.5.0_08为2899M,注意Xmx的内存不是物理内存,我的机子物理内存只有1G。jrockit不愧为java第一虚拟机,只可惜不开源。 linux 可以寻址的最大内存 Intel X86 .最大CPU数: 32(包括逻辑CPU).最大内存: 64GB.最大文件大小: 8TB.最大文件系统大小(ext3): 16TB.最大每个进程的虚拟地址空间: 4GB AMD 64/EM64T .最大CPU数: 64.最大内存: 128GB.最大文件大小: 8TB.最大文件系统大小(ext3): 16TB.最大每个进程的虚拟地址空间: N/A 请注意上面是标准的最大限制, 请不要跟Linux集群系统混淆(能扩充到1024个CPU).


阅读全文(20571) | 回复(2) | 编辑 | 精华
 


回复:java进程使用的最大内存的数值
原创空间,  软件技术,  电脑与网络

坏男孩(游客)发表评论于2007/7/17 9:03:59

下载地址在这 bea.com/jrockit


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.828 second(s), page refreshed 144822021 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号