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

Java 64位JVM的最大堆大小是多少?,java,jvm,64-bit,heap-memory,jvm-arguments,Java,Jvm,64 Bit,Heap Memory,Jvm Arguments,在32位系统中,可以使用-Xmx设置的理论最大堆值当然是2^32字节,但通常(请参见:)不能使用所有4GB 对于在64位机器上的64位操作系统中运行的64位JVM,除了2^64字节或16 EB的理论限制之外,还有什么限制吗 我知道,出于各种原因(主要是垃圾收集),过大的堆可能不明智,但鉴于阅读了有关内存为terrabytes的服务器的文章,我想知道有什么可能。如果您想使用32位引用,堆限制为32 GB 但是,如果您愿意使用64位引用,那么其大小可能会受到操作系统的限制,就像32位JVM一样。e、

在32位系统中,可以使用
-Xmx
设置的理论最大堆值当然是
2^32
字节,但通常(请参见:)不能使用所有4GB

对于在64位机器上的64位操作系统中运行的64位JVM,除了
2^64
字节或16 EB的理论限制之外,还有什么限制吗


我知道,出于各种原因(主要是垃圾收集),过大的堆可能不明智,但鉴于阅读了有关内存为terrabytes的服务器的文章,我想知道有什么可能。

如果您想使用32位引用,堆限制为32 GB

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

注意:您需要将JVM堆放入主内存中,最好是在一个NUMA区域内。在更大的机器上大约是1 TB。如果JVM跨越NUMA区域,那么内存访问尤其是GC将花费更长的时间。如果JVM堆开始交换,GC可能需要几个小时,甚至会使机器无法使用,因为它会破坏交换驱动器

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

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


答案显然取决于JVM实现。那就是他们的JVM

可以缩放。。。超过1/2 TB的内存


“可以扩展”的意思似乎是“运行良好”,而不是“完全运行”。

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

见:

每个64位进程的用户模式虚拟地址空间;
设置图像\u文件\u大\u地址\u感知(默认):
x64:8 TB
英特尔IPF:7 TB

vmargs接受2 GB的图像文件、大地址和已清除的

我尝试了
-Xmx32255M
,用于压缩OOP

对于在64位机器上的64位操作系统中运行的64位JVM,除了2^64字节或16 EB的理论限制之外,还有什么限制吗

您还必须考虑硬件限制。虽然指针可能是64位的,但当前CPU只能寻址一个

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

第三个是实用性。即使您可以拥有那么多虚拟内存,也不意味着CPU支持那么多物理内存,如果没有物理内存,您最终将进行交换,这将对JVM的性能产生不利影响,因为GCs通常必须接触堆的很大一部分


正如其他答案提到的压缩OOP:通过将对象对齐度提高到8个字节以上,压缩OOP的限制可以是

,理论上一切都是可能的,但实际上,您会发现这些数字比您预期的要低得多。 我经常尝试解决服务器上的巨大空间问题,发现即使服务器可以拥有巨大的内存,但让我惊讶的是,大多数软件实际上永远无法在真实场景中解决它,因为cpu的速度不够快,无法真正解决它们。 你为什么说对了。计时这就是我工作过的每台巨大机器的没完没了的崩溃。 因此,我建议不要因为你可以,就过火地处理大量的问题,而是使用你认为可以使用的东西。 实际值通常远低于您的预期值。 当然,我们中没有人真正在家里使用hp 9000系统,而你们中的大多数人实际上都会接近家庭系统的容量。 例如,大多数用户的系统内存不超过16GB。当然,一些休闲游戏玩家每月使用一次游戏工作站,但我敢打赌这是一个非常小的百分比。 因此,脚踏实地意味着我将在8GB 64位系统上解决heapspace不超过512MB的问题,或者如果你太过火了,试试1GB。我敢肯定,即使有这些数字,也完全是过火了。 我一直在游戏期间监控内存使用情况,看看寻址是否会产生任何差异,但当我寻址更低或更大的值时,根本没有注意到任何差异。即使在服务器/工作站上,无论我设置的值有多大,性能也没有明显的变化。 这并不是说一些jave用户可以利用更多的空间,但到目前为止,我还没有看到任何应用程序需要如此多的空间。 当然,我假设如果java实例没有足够的heapspace来使用,它们的性能会有一点差异。 到目前为止,我还没有发现它的任何一个,然而,如果你设置了太多的heapspace,缺乏实际安装的内存显示性能会立即下降。
当你有一个4 Gb的系统时,你很快就用完了heapspace,然后你会看到一些错误和速度减慢,因为人们占用了太多的空间,而实际上系统中没有空闲空间,所以操作系统开始寻址驱动器空间以弥补不足,因此它开始交换。

我想你在几年内不必担心这个限制年。添加更多内存实际上有助于GC,因为它被迫运行的频率较低。最糟糕的情况是,完整GC时间通常与所用堆的大小成正比。粗略的近似值为每GB 1秒。对于大多数应用程序来说,分钟的完整GC是不可接受的