【问题标题】:Max memory for 64bit Java64 位 Java 的最大内存
【发布时间】:2011-01-06 19:29:31
【问题描述】:

在 64 位平台上可以为 java 分配的最大堆空间量是多少?是无限的吗?

【问题讨论】:

  • 为什么你认为它是无限的?

标签: java heap-memory


【解决方案1】:

理论上 264,但可能有限制(显然)

根据this FAQ,它仅受本地系统上的内存和交换空间的限制:

在 64 位 VM 上,您可以使用 64 位可寻址性,从而导致最大 Java 堆大小仅受系统提供的物理内存量和交换空间量的限制。

另请参阅 为什么我不能使用 32 位 JVM 获得更大的堆?

另外请记住,您需要通过命令行设置最大堆。没有 -Xmx 命令。没有它,Java 使用 64mb + 30% = 83.2mb 作为 64 位机器上的默认最大堆,根据相同的常见问题解答。

java -Xmx1000g myClass 

在我的机器上运行良好。但它似乎还不支持 't' 修饰符,因此您还不能以 TB 为单位指定最大内存 :)

【讨论】:

  • 1000g 对你有用吗?我认为java 会在接受该选项之前验证是否有足够的内存。
【解决方案2】:

如果您可以将宇宙中的每个原子都制成一个字节的 RAM,您就可以将其分配到 64 位地址空间中。

其实有点夸张。

宇宙中有 10^80 个原子(根据 WolframAlpha),在 64 位系统中有 2^64 字节的地址空间,因此您只能寻址每 5x10^60 个原子中的 1 个。但如果你有 18 千亿字节的 RAM,你可能需要几个量子黑洞来为它供电。

【讨论】:

  • @Stephen,我在您发表评论之前编辑了答案。 WolframAlpha 规则!
  • 不想等待完整的收集!
  • 就在我认为 Java 开始变得无聊的时候,我遇到了这样的旧帖子。恢复对 OOP 的信心。
【解决方案3】:

这可能取决于您的 VM 运行的系统。如果您运行的是 AMD x64 架构,则当前交付的处理器的地址空间使用 48 位,而不是 64 位。这导致理论上的最大值约为 256 TB。 (见http://en.wikipedia.org/wiki/X86-64

我不是虚拟机专家,但任何现代操作系统通常都会提供与物理 RAM 和可用虚拟内存一样多的内存。 可能这就是 VM 将根据其配置传递给您的应用程序的内容。

【讨论】:

  • 相关 AMD 手册指出虚拟地址空间实际上是 64 位(第 2.2.1 章,AMD64 架构程序员手册,v3.14,2007 年 9 月)
【解决方案4】:

对于 Sun 最近的 VM,实际堆限制大小通常是可用物理和/或虚拟内存的 512 倍。即使理论上的限制要高得多,VM 也会在启动时为每 512 字节的堆内存分配 1 字节用于管理目的,因此 1TB 的堆将立即需要 2GB 的内存管理。

【讨论】:

  • 你能引用一个参考吗?
  • 你不会找到任何参考。这只是虚拟机的实现方式,或者至少是在两年前的当前版本中实现的。
【解决方案5】:

理论上它在2^632^64 字节之间。

实际上,它受到计算机上可用物理内存和交换空间的限制。而物理内存又受到芯片组(即物理内存地址总线上的地址引脚数量)和主板(即 DIMM 插槽的数量和大小)的限制。

【讨论】:

  • 对于 AMD64,目前的规范预计有 40-52 个地址引脚。此外,它们支持 NUMA 架构,其中每个处理器都有一块内存,其他处理器只能间接访问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 2018-04-30
  • 2012-04-30
  • 2013-08-20
  • 2011-05-27
  • 2017-04-30
相关资源
最近更新 更多