在64位平台上,可以为Java分配的最大堆空间量是多少?它是无限的吗?
答案 0 :(得分:16)
理论上2 64 ,但可能存在局限性(显然)
根据this FAQ,它仅受本地系统上内存和交换空间的限制:
在64位虚拟机上,你有64位的可寻址性来处理最大Java堆大小仅受系统提供的物理内存和交换空间量的限制。
参见为什么我不能使用32位JVM获得更大的堆?
另请注意,您需要通过命令行设置max heap。没有-Xmx命令。没有它根据相同的FAQ,Java在64位计算机上使用64mb + 30%= 83.2mb作为默认最大堆。
java -Xmx1000g myClass
在我的机器上正常工作。但它似乎还不支持't'修饰符,所以你不能用太字节指定最大内存:)
答案 1 :(得分:14)
如果您可以将Universe中的每个原子都放入一个RAM字节中,则可以将其分配到64位地址空间中。
实际上,这有点夸大其词。
宇宙中有10 ^ 80个原子(根据WolframAlpha),在64位系统中有2 ^ 64个字节的地址空间,所以你只能解决每5x10 ^ 60个原子中的1个原子。但是如果你有18个qintillion字节的RAM,你可能需要一些量子黑洞来为它供电。
答案 2 :(得分:3)
这可能取决于运行VM的系统。如果您运行的是AMD x64架构,当前出货的处理器的地址空间使用48位而不是64位。这导致理论最大值大约为256 TB。 (见http://en.wikipedia.org/wiki/X86-64)
我不是VM的专家,但任何现代操作系统通常会提供与物理RAM和可用虚拟内存一样多的内存。 可能这是VM将根据其配置传递给您的应用程序的内容。
答案 3 :(得分:2)
使用Sun的最新VM,实际堆限制大小通常是可用物理和/或虚拟内存的512倍。即使理论上的限制要高得多,VM也会在启动时为每个512字节的堆内存分配1个字节用于管理,因此1TB的堆将立即需要2GB用于内存管理。
答案 4 :(得分:0)
理论上它在2^63
和2^64
字节之间。
实际上,它受到计算机上可用物理内存和交换空间的限制。而物理内存又受到芯片组(即物理内存地址总线上的地址引脚数)和主板(即DIMM插槽的数量和大小)的限制。