32位操作系统上的JVM堆大小

时间:2010-11-02 16:48:51

标签: java windows eclipse 32bit-64bit heap-memory

我正在使用32位win.7并使用Eclipse。还有4GB RAM。

我想为我的java应用程序分配大约3 GB的最大堆,但我可以通过VM参数-Xmx1056m分配最大1.5GB。

我该怎么办?如果我安装64位win.7。那么它能够为我的应用程序分配3GB堆大小吗?

4 个答案:

答案 0 :(得分:3)

即使您有更多可用内存,常规32位Windows进程也只能处理2GB内存。您可以找到不同Windows版本here的内存限制。

由于VM需要的内存不仅仅是堆,因此最大堆大小将略小于进程可用的最大内存量。通常,对于32位Windows VM,您可以将堆调整到大约1.6GB。

答案 1 :(得分:2)

你需要一个64位操作系统和64位虚拟机来分配这么多内存。

答案 2 :(得分:-1)

我现在没有描述JVM内存管理过程的链接。您偶然发现的限制是Java执行垃圾收集的方式的限制。 Java内存堆必须是一个有名的块。垃圾收集算法针对此设计限制进行了优化,因此可以高效执行。在32位操作系统中,您无法控制加载设备驱动程序的内存地址。在Windows上,如果操作系统与已加载的代码冲突,则操作系统将仅重新分配存储在DLL中的设备驱动程序基址。其他操作系统可能会在加载时重新分配所有设备驱动程序,因此它们位于内核附近的连续块中。

基本上,64位和32位操作系统的限制是相同的。它只是在64位操作系统上,还有几个地址范围可供选择。确保使用64位JVM来匹配操作系统。这就是为什么64位操作系统能够找到比32位操作系统更大的内存地址块。

编辑:此外,32位JVM的最大堆大小限制为2GB。

<强>参考:

http://publib.boulder.ibm.com/infocenter/javasdk/tools/index.jsp?topic=/com.ibm.java.doc.igaa/_1vg00014884d287-11c3fb28dae-7ff6_1001.html

Java maximum memory on Windows XP

http://forums.sun.com/thread.jspa?messageID=2715152#2715152

答案 3 :(得分:-2)

您需要的不仅是64位操作系统和64位虚拟机,还需要更多内存。

在32位Windows系统上,虚拟地址空间分为2 GB用于内核操作,2 GB用于用户应用程序。所以你搞砸了。

有一种可能但非常不可能的解决方法:您可以enable /3GB switch来提高此限制并让系统为内核操作分配1GB的虚拟地址空间,为用户应用程序分配3GB(如果有的话)是/LARGEADDRESSPACEAWARE)。

不幸的是,32位Sun / Oracle HotSpot JVM不是LARGEADDRESSAWARE(我知道),而其他32位JVM可能也不是。

但请想一想:即使你能够做到这一点,你也可以使用系统可用的所有内存。 在为JVM分配3GB堆之后,其他程序将不会有任何。您的系统将始终交换到磁盘。它将无法使用。

获得更多内存的64bis操作系统。这就是你的全部,而不是找到让你的程序使用更少内存的方法。