资源描述:
《JVM内存最大能调多大分析.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、JVM内存最大能调多大分析【经典】2010-11-1013:21转载自suofang最终编辑suofang上次用weblogic把-XmxXXXX设成2G,就启动不起来,设小点就起来了,当时很气,怎么2G都起不了,今天在看到了一篇解释,转过来了这次一位老友提出了这个问题,记得当年一个java高手在blogjava提出后,被骂得半死。大家使用java-XmxXXXX-version版本得出了不同的结论。后来老友说大概是1800M左右,我当时反驳,“我设置过服务器8G内存,我使用两个tomcat,每个2G”。为此,我翻开所
2、有的JVM的内存管理的c代码,没有任何结论。我不是linux内核程序员,但是我看过linux的源码,知道32位体系结构的计算机寻址空间是2^32=4G,intelPentiumPro处理器寻址空间是36位,CPU内部增加了PAE寄存器。用于处理多出来的4根地址线的使用,所以PAE的技术实现最大2^36=64G寻址。通过linux的内核源码,标准Linux内核对于物理内存的管理采用1:3的分配比例,即物理内存的1/4为内核空间(kernelspace),剩下的3/4为用户进程空间(userspace),因此,在一台4G内
3、存的服务器上,用户进程可使用的内存最大也就是3G。当进程被内核调入CPU运行时,不同的地址空间数据会被调入4G以内的用户进程空间,其实就能用3G。IA32架构上,单一进程是不能使用超过4G的内存空间的。但是我记得我给mysqlserver分配内存大约是1.7G左右,不是2的32次方-1,我分配java2G内存的计算机是IBM的RS6000.经过不同平台的测试,我得出了大概的数值,win2k下1.6G左右,nt下1.2G,原因是这样的,ClassicVMandHotSpotVM存放用户区的连续地址中,NT把kernelD
4、LLs放在0x7c开头的地址空间,所以nt下只有<2G的空间,所以JVMheap使用极限是2G.用户的dll开始于0x,用户的应用程序开始于0x.我现在唯一确定的是sun可能为了防止和某些JVM插件的冲突,把dll的地址给rebase一下,这样使用的空间就很少了一部分.为什末rebase,原因是这样的,因为在windows下编译dll的默认地址都是,一般在release之前的时候要rebase一下,rebase的-b这个参数是指定一个起始地址,MSDN建议地址是0x,这个工具随visualstudio和platform
5、SDK发放。例如rebase.exe-b0x6Djdkjrebin*.dlljdkjrebinhotspotjvm.dll这样你的JVM用的内存多一些,目前关于这个我只能得到BEA的JRockit最大也只能使用1.8G内存,看来各家编译JDK时都作了些手脚.目前只能得到bea的的-Xmx最小值是16MB,sun的资料很不全,还好java开源了,可以不依靠sun了.sun提供的资料MaximumAddressSpacePerProcess OperatingSystem
6、 MaximumAddressSpacePerProcessRedhatLinux 32bit 2GBRedhatLinux 64bit 3GBWindows98/2000/NT/Me/XP 2GBSolarisx86(32bit) 4GBSolar
7、is32bit 4GBSolaris64bit Terabytes以上文档有误,32位的redhatServer利用 Highmem技术可以使用3G内存.solaris不愧是java的诞生平台。问了一下bea的工程师,得出大致的结论,Windows2003/XPusingthe/3GBswitch(32-bitOS)1.85GB-JRockit5.0R2
8、5.2(SP2)2.85GB-JRockit5.0R26(SP3)Windows2003/XPx64Editionwitha32-bitJVM(64-bitOS)2.05GB-JRockit5.0R25.2(SP2)3.85GB-JRockit5.0R26(SP3)对于windows2000打开3G模式,windows核心编程说得