【发布时间】:2011-01-06 19:29:31
【问题描述】:
在 64 位平台上可以为 java 分配的最大堆空间量是多少?是无限的吗?
【问题讨论】:
-
为什么你认为它是无限的?
标签: java heap-memory
在 64 位平台上可以为 java 分配的最大堆空间量是多少?是无限的吗?
【问题讨论】:
标签: java heap-memory
理论上 264,但可能有限制(显然)
根据this FAQ,它仅受本地系统上的内存和交换空间的限制:
在 64 位 VM 上,您可以使用 64 位可寻址性,从而导致最大 Java 堆大小仅受系统提供的物理内存量和交换空间量的限制。另请参阅 为什么我不能使用 32 位 JVM 获得更大的堆?
另外请记住,您需要通过命令行设置最大堆。没有 -Xmx 命令。没有它,Java 使用 64mb + 30% = 83.2mb 作为 64 位机器上的默认最大堆,根据相同的常见问题解答。
java -Xmx1000g myClass
在我的机器上运行良好。但它似乎还不支持 't' 修饰符,因此您还不能以 TB 为单位指定最大内存 :)
【讨论】:
java 会在接受该选项之前验证是否有足够的内存。
如果您可以将宇宙中的每个原子都制成一个字节的 RAM,您就可以将其分配到 64 位地址空间中。
其实有点夸张。
宇宙中有 10^80 个原子(根据 WolframAlpha),在 64 位系统中有 2^64 字节的地址空间,因此您只能寻址每 5x10^60 个原子中的 1 个。但如果你有 18 千亿字节的 RAM,你可能需要几个量子黑洞来为它供电。
【讨论】:
这可能取决于您的 VM 运行的系统。如果您运行的是 AMD x64 架构,则当前交付的处理器的地址空间使用 48 位,而不是 64 位。这导致理论上的最大值约为 256 TB。 (见http://en.wikipedia.org/wiki/X86-64)
我不是虚拟机专家,但任何现代操作系统通常都会提供与物理 RAM 和可用虚拟内存一样多的内存。 可能这就是 VM 将根据其配置传递给您的应用程序的内容。
【讨论】:
对于 Sun 最近的 VM,实际堆限制大小通常是可用物理和/或虚拟内存的 512 倍。即使理论上的限制要高得多,VM 也会在启动时为每 512 字节的堆内存分配 1 字节用于管理目的,因此 1TB 的堆将立即需要 2GB 的内存管理。
【讨论】:
理论上它在2^63 和2^64 字节之间。
实际上,它受到计算机上可用物理内存和交换空间的限制。而物理内存又受到芯片组(即物理内存地址总线上的地址引脚数量)和主板(即 DIMM 插槽的数量和大小)的限制。
【讨论】: