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

时间:2011-10-05 14:45:33

标签: java jvm 64-bit heap-memory jvm-arguments

在32位系统中可以使用-Xmx设置的理论最大堆值当然是2^32个字节,但通常(请参阅:Understanding max JVM heap size - 32bit vs 64bit)不能使用全部4GB

对于在64位计算机上运行64位操作系统的64位JVM,除2^64字节或16艾字节的理论限制外是否有任何限制?

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

6 个答案:

答案 0 :(得分:22)

如果要使用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。

Compressed oops in the Hotspot JVM

  

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

答案 1 :(得分:3)

答案显然取决于JVM的实现。 {J}

Azul claim
  

可以扩展到超过1/2太字节的内存

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

答案 2 :(得分:2)

Windows对每个进程施加内存限制,您可以看到每个版本的内容here

见:

User-mode virtual address space for each 64-bit process; With IMAGE_FILE_LARGE_ADDRESS_AWARE set (default): x64: 8 TB Intel IPF: 7 TB 2 GB with IMAGE_FILE_LARGE_ADDRESS_AWARE cleared

答案 3 :(得分:0)

我试过-Xmx32255M被vmargs接受压缩oops。

答案 4 :(得分:0)

  

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

您还必须考虑硬件限制。虽然指针可能是64位,但当前CPU只能处理less than 2^64 bytes worth of virtual memory

使用未压缩的指针,热点JVM需要为其堆提供连续的虚拟地址空间块。因此硬件之后的第二个障碍是提供如此大块的操作系统,并非所有操作系统都支持这一点。

第三个是实用性。即使你可以拥有那么多的虚拟内存,也不意味着CPU支持那么多物理内存,没有物理内存你最终会交换,这会对JVM的性能产生负面影响,因为GC通常需要触及很大一部分堆的。

正如其他答案提到压缩oops:通过将对象对齐高于8个字节,压缩oops的限制可以是increased beyond 32GB

答案 5 :(得分:-1)

从理论上讲,一切皆有可能,但实际上,您发现的数字比您预期的要低得多。 我一直在尝试经常处理服务器上的巨大空间,发现即使服务器可以拥有大量内存,但令我惊讶的是,大多数软件实际上无法在实际情况下解决该问题,原因仅在于cpu的速度不足以真正解决这些问题。 你为什么说正确? 。时间就是我工作过的每台巨大机器的无尽崩溃。 因此,我建议不要仅仅因为您能就解决大量问题而过度,而应使用您认为可以使用的内容。 实际值通常远低于您的预期。 当然,我们当中没有一个人真正在家中使用hp 9000系统,实际上你们中的大多数人几乎都将接近家庭系统的容量。 例如,大多数用户的系统内存不超过16 Gb。当然,有些休闲游戏玩家每月会使用工作站玩一次游戏,但我敢打赌这是一个很小的百分比。 因此,脚踏实地意味着我将在8 Gb 64位系统上处理不超过512 mb的堆空间,或者如果您过度使用,则尝试1 Gb。即使这些数字纯属杀伤力,我也可以肯定。 我一直在游戏过程中监视内存使用情况,以查看寻址是否会产生任何变化,但当我处理低得多或大得多的值时根本看不到任何变化。即使在服务器/工作站上,无论我设置多大的值,性能也没有明显变化。 但这并不意味着某些jave用户可能能够利用更多的寻址空间,但是到目前为止,我还没有看到任何应用程序需要这么多的东西。 当然,我认为如果Java实例用完足够的堆空间来使用它们,它们的性能差异将很小。 到目前为止,我什么都没有找到,但是如果您设置了太多的堆空间,那么实际安装的内存不足会立即导致性能下降。 当您有一个4 Gb系统时,您很快就会耗尽堆空间,然后会看到一些错误和速度下降,因为人们处理了太多空间,而这些空间实际上是系统中不可用的,因此os开始解决驱动器空间以弥补不足因此它开始交换。