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

新手上路,请多包涵

问题不在于 32 位操作系统上的最大堆大小,因为 32 位操作系统的最大可寻址内存大小为 4GB,并且 JVM 的最大堆大小取决于可以保留多少连续空闲内存。

我更感兴趣的是了解在 64 位操作系统中运行的 32 位 JVM 的最大(理论和实际可实现的)堆大小。基本上,我正在寻找类似于 SO 上相关问题中的数字的 答案。

至于为什么使用 32 位 JVM 而不是 64 位 JVM,原因不是技术原因而是管理/官僚主义——在生产环境中安装 64 位 JVM 可能为时已晚。

原文由 Vineet Reynolds 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

期望拥有单个大内存块并使用原始指针的 32 位 JVM 不能使用超过 4 Gb(因为这是 32 位限制,也适用于指针)。这包括 Sun 和 - 我很确定 - 还包括 IBM 实现。我不知道例如 JRockit 或其他人是否在其 32 位实现中有大内存选项。

如果您预计会达到此限制,您应该强烈考虑启动一个并行轨道,为您的生产环境验证 64 位 JVM,以便在 32 位环境崩溃时做好准备。否则你将不得不在压力下完成这项工作,这从来都不是一件好事。


编辑 2014-05-15:甲骨文常见问题解答:

32 位 JVM 的最大理论堆限制为 4G。由于可用交换空间、内核地址空间使用、内存碎片和 VM 开销等各种额外限制,实际上该限制可能要低得多。在大多数现代 32 位 Windows 系统上,最大堆大小范围为 1.4G 到 1.6G。在 32 位 Solaris 内核上,地址空间限制为 2G。在运行 32 位 VM 的 64 位操作系统上,最大堆大小可能更高,在许多 Solaris 系统上接近 4G。

( http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_heap_32bit )

原文由 Thorbjørn Ravn Andersen 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以询问 Java 运行时:

 public class MaxMemory {
    public static void main(String[] args) {
        Runtime rt = Runtime.getRuntime();
        long totalMem = rt.totalMemory();
        long maxMem = rt.maxMemory();
        long freeMem = rt.freeMemory();
        double megs = 1048576.0;

        System.out.println ("Total Memory: " + totalMem + " (" + (totalMem/megs) + " MiB)");
        System.out.println ("Max Memory:   " + maxMem + " (" + (maxMem/megs) + " MiB)");
        System.out.println ("Free Memory:  " + freeMem + " (" + (freeMem/megs) + " MiB)");
    }
}

这将根据默认堆分配报告“最大内存”。所以你仍然需要玩 -Xmx (在 HotSpot 上)。我发现在 Windows 7 Enterprise 64 位上运行时,我的 32 位 HotSpot JVM 最多可以分配 1577MiB:

[C:scratch]> java -Xmx1600M MaxMemory
虚拟机初始化时出错
无法为对象堆保留足够的空间
无法创建Java虚拟机。
[C:scratch]> java -Xmx1590M MaxMemory
总内存:2031616 (1.9375 MiB)
最大内存:1654456320 (1577.8125 MiB)
可用内存:1840872(1.75559234619 MiB)
[C:划痕]>

而在同一操作系统上使用 64 位 JVM,当然要高得多(大约 3TiB)

[C:scratch]> java -Xmx3560G MaxMemory
虚拟机初始化时出错
无法为对象堆保留足够的空间
[C:scratch]> java -Xmx3550G MaxMemory
总内存:94240768 (89.875 MiB)
最大内存:3388252028928 (3184151.84297 MiB)
可用内存:93747752 (89.4048233032 MiB)
[C:划痕]>

正如其他人已经提到的,这取决于操作系统。

对于 64 位主机操作系统,如果 JVM 是 32 位,它仍然会依赖,很可能像上面演示的那样。

-- 更新 20110905 :我只是想指出一些其他观察结果/细节:

  • 我运行它的硬件是 64 位的,安装了 6GB 的实际 RAM。操作系统是 Windows 7 企业版,64 位
  • 可以分配的 Runtime.MaxMemory 的实际数量也取决于操作系统的 _工作集_。我曾经在运行 VirtualBox 时运行过它,发现我 无法 使用 -Xmx1590M 成功启动 HotSpot JVM 并且不得不变小。这也意味着您可能会获得超过 1590M,具体取决于您当时的工作集大小(尽管我仍然认为由于 Windows 的设计,对于 32 位,它会低于 2GiB)

原文由 mike 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题