使用64位JVM的最大堆大小是多少?

Mic*_*wan 26 java 64-bit jvm heap-memory jvm-arguments

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

对于在64位计算机上运行64位操作系统的64位JVM,除了理论上的2^64字节限制或16艾字节外,还有其他限制吗?

我知道由于各种原因(主要是垃圾收集),过大的堆可能不明智,但鉴于阅读有关TB的TB的服务器,我想知道什么是可能的.

Pet*_*rey 23

如果要使用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以上.

Hotspot JVM中的压缩oops

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

  • 使用64位JVM,最新版本默认启用`-XX:+ UseCompressedOops`.这样做是使用对对象的32位"压缩"引用.由于对象是8字节对齐的(并且它们的地址的最低3位始终为0),因此它可以引用2 ^ 32*8字节或32 GB. (5认同)
  • 32位引用最多只能解决4 GB,不是吗?您将如何配置64位引用? (2认同)