应用程序可以使用多少内存

发表于:2007-06-11来源:作者:点击数: 标签:
常常听到一些 开发 人员抱怨,我的机器有那么多空闲内存,为什么应用程序使用不了?当今多数应用仍然是32位的,所以虚拟地址空间只有4GB。但其实这个问题远没有那么简单。 比如,大多数情况下(也是缺省情况下),我们用的 java 都是32位的JVM。你想把 Java

常常听到一些开发人员抱怨,我的机器有那么多空闲内存,为什么应用程序使用不了?当今多数应用仍然是32位的,所以虚拟地址空间只有4GB。但其实这个问题远没有那么简单。

比如,大多数情况下(也是缺省情况下),我们用的java都是32位的JVM。你想把Java的heap size设成4GB,但这是不可能的。因为4GB的虚拟地址空间要包含JVM的代码以及它所调用的库,堆(heap), 还有线程的堆栈,特别是当你的应用有几百个线程的时候,这些都会占去一些空间。

那么,把java的heap size设成3.6G左右是不是就应该没问题了?这也未必,因为对于Solaris x86 32位的操作系统,虚拟地址空间是user和kernel共享的。那么kernel又会用去多少空间呢。也许你不相信,这和物理内存的大小有关。请看一段opensolaris的程序:

http://cvs.opensolaris.org/source/xref/on/usr/src/uts/i86pc/os/startup.c#404

424 * mem size for kernelbase kernel heap

425 * size page_t's size

426 * ---- --------- ---------- -----------

427 * 1gb 0x01400000 0xd1800000 684MB

428 * 2gb 0x02800000 0xcf000000 704MB

429 * 4gb 0x05000000 0xca000000 744MB

430 * 6gb 0x07800000 0xc5000000 784MB

431 * 8gb 0x0a000000 0xc0000000 824MB

432 * 16gb 0x14000000 0xac000000 984MB

433 * 32gb 0x28000000 0x84000000 1304MB

434 * 64gb 0x50000000 0x34000000 1944MB

User space的地址空间是kernelbase的值以下的空间,kenerl space则使用kernelbase的值以上的空间。如果你想多给一些user space空间,你可能需要用eeprom调整kernelbase的值,但可能要冒kernel space空间不够的风险。

对于32位的Windows, 我听到的说法是User space只有2GB的地址空间,对于32位的linux,我听到的说法是User space是3GB。我没有验证过。大家可以找台内存大点儿的PC机试试:java -Xms2000m -Xmx2000m -version 看能不能正常运行。

对于32位的应用,我如何才能真正获得更大的user space的地址空间呢?你可以使用64位的Solaris的kernel,比如Solaris x86 64-bit 简称Solaris x64。当然,你需要有64位的CPU比如amd64。这时user space的地址空间的上限是0xfe000000,接近4GB。

Solaris x86安装好后,实际上有两份kernel,一个32位,另一个64位。可以通过以下命令切换,然后重起系统:

//32-bit

#eeprom boot-file=kernel/unix

//64-bit

#eeprom boot-file=kernel/amd64/unix

这一点Solaris x86比windows和linux要好,它们的操作系统32位和64位需要不同的安装包。而Solaris x86有一个统一的安装包针对所有x86平台。



参考资料:

http://blogs.sun.com/roller/page/kchow?entry=x86_32_bit_virtual_address

(责任编辑:海纳百川  qlmzl11268@hotmail.com    TEL:(010)68476606-8007)



原文转自:http://www.ltesting.net

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
...