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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (1211)

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

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

至于为什么使用32位JVM而不是64位JVM,原因不是技术性的,而是管理/官僚性 - 在生产环境中安装64位JVM可能已经太晚了。

提问于
用户回答回答于

希望有一大块内存并使用原始指针的32位JVM不能使用超过4 Gb(因为这是32位限制,这也适用于指针)。这包括Sun和 - 我非常肯定 - 也是IBM的实施。我不知道JRockit或其他公司是否有32位实现的大内存选项。

如果您希望达到此限制,则应该强烈考虑启动一条平行通道,为您的生产环境验证64位JVM,以便在32位环境发生故障时做好准备。否则,你将不得不在压力下做这件事,这从来都不好。

Oracle常见问题解答:

32位JVM的最大理论堆限制是4G。由于可用交换,内核地址空间使用,内存碎片和虚拟机开销等各种附加限制,实际上限制可能会低得多。在大多数现代的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)

用户回答回答于

你可以问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
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
[C:scratch]> java -Xmx1590M MaxMemory
Total Memory: 2031616 (1.9375 MiB)
Max Memory:   1654456320 (1577.8125 MiB)
Free Memory:  1840872 (1.75559234619 MiB)
[C:scratch]>

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

[C:scratch]> java -Xmx3560G MaxMemory
Error occurred during initialization of VM
Could not reserve enough space for object heap
[C:scratch]> java -Xmx3550G MaxMemory
Total Memory: 94240768 (89.875 MiB)
Max Memory:   3388252028928 (3184151.84297 MiB)
Free Memory:  93747752 (89.4048233032 MiB)
[C:scratch]>

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

  • 对于32位Windows:它将<2GB(Windows内部版本为用户进程指定2GB)
  • 对于32位BSD / Linux:<3GB(来自魔鬼书)
  • 对于32位MacOS X:<4GB(来自Mac OS X内部版本
  • 不确定32位Solaris,请尝试上面的代码并告诉我们。

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

只想指出一些其他观察/细节:

  • 我运行的硬件是64位,安装了6GB的实际内存。操作系统是Windows 7 Enterprise,64位
  • 实际Runtime.MaxMemory分配的金额也取决于操作系统的工作集。我曾经运行这个程序,同时我也运行了VirtualBox,发现我无法成功启动HotSpot JVM -Xmx1590M并且必须变小。这也意味着你可能会获得超过1590M的时间,这取决于你当时的工作集规模(尽管我仍然保持它将在2GiB下32位,因为Windows的设计)

扫码关注云+社区

领取腾讯云代金券