64 位 JVM 的最大可能堆大小是多少?

2022-09-01 07:52:59

在 32 位系统中可以设置的理论最大堆值当然是字节,但通常(请参阅:了解最大 JVM 堆大小 - 32 位与 64 位)不能全部使用 4GB。-Xmx2^32

对于在 64 位操作系统中运行的 64 位 JVM,除了字节或 16 EB 的理论限制之外,是否有任何限制?2^64

我知道由于各种原因(主要是垃圾回收),过大的堆可能并不明智,但是根据阅读有关具有TB级RAM的服务器的信息,我想知道什么是可能的


答案 1

如果要使用 32 位引用,则堆限制为 32 GB。

但是,如果您愿意使用 64 位引用,则大小可能会受到操作系统的限制,就像使用 32 位 JVM 一样。例如,在Windows 32位上,这是1.2到1.5 GB。

注意:您需要将 JVM 堆放入主内存中,最好是在一个 NUMA 区域中。在较大的计算机上,这大约是1 TB。如果您的 JVM 跨越 NUMA 区域,则内存访问(尤其是 GC)将花费更长的时间。如果您的 JVM 堆开始交换,则可能需要数小时才能完成 GC,甚至会使您的计算机在破坏交换驱动器时无法使用。

注: 即使您在堆中使用 32 位引用,也可以访问较大的直接内存和内存映射大小。即使用远高于32 GB。

热点 JVM 中的压缩 oops

压缩的 oops 将托管指针(在 JVM 中的许多但不是所有位置)表示为 32 位值,这些值必须缩放 8 倍并添加到 64 位基址才能找到它们引用的对象。这允许应用程序寻址多达 40 亿个对象(不是字节),或堆大小高达约 32Gb。同时,数据结构紧凑性与ILP32模式具有竞争力。


答案 2

答案显然取决于 JVM 实现。Azul声称他们的JVM

可以扩展...超过 1/2 TB 的内存

通过“可以扩展”,它们似乎意味着“运行井”,而不是“运行”。


推荐