我正在使用32位win.7并使用Eclipse。还有4GB RAM。
我想为我的java应用程序分配大约3 GB的最大堆,但我可以通过VM参数-Xmx1056m
分配最大1.5GB。
我该怎么办?如果我安装64位win.7。那么它能够为我的应用程序分配3GB堆大小吗?
答案 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。
<强>参考:强>
答案 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操作系统。这就是你的全部,而不是找到让你的程序使用更少内存的方法。