【发布时间】:2011-05-04 01:28:45
【问题描述】:
我正在使用 32 位 win.7 并使用 Eclipse。还有 4GB 内存。
我想为我的 java 应用程序分配大约 3 GB 的最大堆大小,但我可以通过 VM 参数 -Xmx1056m 分配最大 1.5GB。
我该怎么办?如果我安装 64 位 win.7。它将能够为我的应用分配 3GB 堆大小吗?
【问题讨论】:
标签: java windows eclipse 32bit-64bit heap-memory
我正在使用 32 位 win.7 并使用 Eclipse。还有 4GB 内存。
我想为我的 java 应用程序分配大约 3 GB 的最大堆大小,但我可以通过 VM 参数 -Xmx1056m 分配最大 1.5GB。
我该怎么办?如果我安装 64 位 win.7。它将能够为我的应用分配 3GB 堆大小吗?
【问题讨论】:
标签: java windows eclipse 32bit-64bit heap-memory
普通的 32 位 Windows 进程只能寻址 2GB 内存,即使您有更多可用内存也是如此。您可以找到不同 Windows 版本的内存限制here。
由于 VM 需要的内存不仅仅用于堆,因此最大堆大小将略小于进程可用的最大内存。通常,对于 32 位 Windows VM,您可以将堆调整到 1.6GB 左右。
【讨论】:
您需要 64 位操作系统和 64 位虚拟机来分配这么多 RAM。
【讨论】:
我现在没有描述 JVM 内存管理过程的链接。您偶然发现的限制是 Java 执行垃圾收集的方式的限制。 Java 内存堆必须是一个连续的块。垃圾收集算法针对此设计限制进行了优化,因此它们可以高效执行。在 32 位操作系统中,您无法控制设备驱动程序加载到的内存地址。在 Windows 上,如果存储在 DLL 中的设备驱动程序基地址与已加载的代码冲突,则操作系统只会重新分配它。其他操作系统可能会在加载时重新分配所有设备驱动程序,以便它们位于内核附近的连续块中。
基本上,64 位和 32 位操作系统的限制是相同的。它只是在 64 位操作系统上,还有更多地址范围可供选择。确保使用 64 位 JVM 来匹配操作系统。这就是为什么 64 位操作系统能够找到比 32 位操作系统更大的连续内存地址块的原因。
编辑:此外,32 位 JVM 的最大堆大小限制为 2GB。
参考:
【讨论】:
您需要的不仅是 64 位操作系统和 64 位虚拟机,还需要更多内存。
在 32 位 Windows 系统上,虚拟地址空间分为 2 GB 用于内核操作,2 GB 用于用户应用程序。所以你完蛋了。
有一种可能但不太可能的解决方法:您可以enable/3GB switch 提高此限制,并让系统为内核操作分配 1GB 的虚拟地址空间,为用户应用程序分配 3GB 的虚拟地址空间(如果它们是 /LARGEADDRESSPACEAWARE )。
不幸的是,32 位 Sun/Oracle HotSpot JVM 不是 LARGEADDRESSAWARE(据我所知),而其他 32 位 JVM 可能也不是。
但请考虑一下:即使您能够做到这一点,您也会使用系统可用的所有内存。为 JVM 分配 3GB 堆后,没有任何东西可供其他程序使用。您的系统将一直交换到磁盘。这将无法使用。
只需获得具有更多 RAM 的 64bis 操作系统即可。这就是你的全部,没有找到让你的程序使用更少内存的方法。
【讨论】: