问题不在于 32 位操作系统上的最大堆大小,因为 32 位操作系统的最大可寻址内存大小为 4GB,并且 JVM 的最大堆大小取决于可以保留多少连续空闲内存。
我更感兴趣的是了解在 64 位操作系统中运行的 32 位 JVM 的最大(理论和实际可实现的)堆大小。基本上,我正在寻找类似于 SO 上相关问题中的数字的 答案。
至于为什么使用 32 位 JVM 而不是 64 位 JVM,原因不是技术原因而是管理/官僚主义——在生产环境中安装 64 位 JVM 可能为时已晚。
原文由 Vineet Reynolds 发布,翻译遵循 CC BY-SA 4.0 许可协议
期望拥有单个大内存块并使用原始指针的 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 )