【问题标题】:JVM Heapsize on 32 bit OS32 位操作系统上的 JVM 堆大小
【发布时间】: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


    【解决方案1】:

    普通的 32 位 Windows 进程只能寻址 2GB 内存,即使您有更多可用内存也是如此。您可以找到不同 Windows 版本的内存限制here。

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

    【讨论】:

    【解决方案2】:

    您需要 64 位操作系统和 64 位虚拟机来分配这么多 RAM。

    【讨论】:

      【解决方案3】:

      我现在没有描述 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

      【讨论】:

      • 不,尝试将 JVM、Java 堆、JVM 堆、线程堆栈、内存映射 JAR 文件、共享库和其他数据段压缩到 32-操作系统留下的位地址空间。
      • 这不是虚拟机限制,而是操作系统限制。 Oracle 的 Solaris 虚拟机是例如能够处理高达 ~3.5GB 的堆,因为 32 位 Solaris 允许每个进程寻址 4GB(而不仅仅是 Windows 和 Linux 的 2GB)。
      • 我之前研究过这个用于托管 Web 应用程序。它既是 JVM 的限制,也是操作系统的限制。事实是 JVM 需要连续的 RAM 块,而 YMMV 需要最大的连续 RAM 块在您的机器上的大小。
      • 我现在在 32 位 Sun Java 1.6 JVM(在 32 位 Linux 上)上运行 Eclipse,主堆为 2.2Gb。 2Gb(总)限制是 32 位 Windows 强加的限制。
      【解决方案4】:

      您需要的不仅是 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 操作系统即可。这就是你的全部,没有找到让你的程序使用更少内存的方法。

      【讨论】:

      • 感谢您的回答,我将在我的电脑上安装 64 位 win7 和 64 位 JVM,然后设置 VM 参数。不仅〜3GB内存而且大于2GB,我正在大规模地进行图形可视化。所以我认为在 4GB 内存上我会给出 ~2.5GB 内存作为 -Xmx 参数。进一步让你知道。其他人可以在 eclipse.ini 文件中为我提供优化参数吗?
      • 此外,我访问了论坛,他们讨论了需要在 eclipse.ini 文件中添加的不同优化参数。我希望有人能提供我整合的优化列表 pf thise vm arguments。跨度>
      • @Aijazz:你可以在 stackoverflow 上找到这个列表,关于这个已经有很多问题了。您想运行 eclipse 和您的应用程序,还是 eclipse 是您在原始问题中谈到的应用程序?
      • @Aijazz:有关 Eclipse ini 设置,请参见此处:stackoverflow.com/questions/142357/…
      • @haylem - 是的。默认情况下,在 32 位 Windows 上,只有 2Gb 的虚拟地址空间可供用户应用程序使用;见en.wikipedia.org/wiki/Virtual_address_space
      猜你喜欢
      • 2012-07-26
      • 2012-05-14
      • 2014-03-14
      • 2011-01-28
      • 2015-09-26
      • 2013-02-12
      • 2013-08-29
      • 2011-12-18
      • 1970-01-01
      相关资源
      最近更新 更多