Java 数组有最大尺寸吗?

新手上路,请多包涵

Java 数组可以包含的元素数量是否有限制?如果是这样,它是什么?

原文由 Lizard 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 431
2 个回答

使用

OpenJDK 64-Bit Server VM (build 15.0.2+7, mixed mode, sharing)

…在 MacOS 上,答案似乎是 Integer.MAX_VALUE - 2 。一旦你超越了那个:

 cat > Foo.java << "END"
public class Foo {
  public static void main(String[] args) {
    boolean[] array = new boolean[Integer.MAX_VALUE - 1]; // too big
  }
}
END
java -Xmx4g Foo.java

… 你得到:

 Exception in thread "main" java.lang.OutOfMemoryError:
  Requested array size exceeds VM limit

原文由 Kevin Bourrillion 发布,翻译遵循 CC BY-SA 4.0 许可协议

这(当然)完全取决于虚拟机。

Browsing through the source code of OpenJDK 7 and 8 java.util.ArrayList , .Hashtable , .AbstractCollection , .PriorityQueue , and .Vector ,你可以看到这个 声明 被重复:

 /**
 * Some VMs reserve some header words in an array.
 * Attempts to allocate larger arrays may result in
 * OutOfMemoryError: Requested array size exceeds VM limit
 */
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

由 Martin Buchholz(Google) 于 2010-05-09 添加;由 Chris Hegarty (Oracle) 审核。

因此, 也许 我们可以说最大的“安全”数字是 2 147 483 639Integer.MAX_VALUE - 8 )并且“尝试分配更大的数组可能会导致 OutOfMemoryError ”。

(是的,Buchholz 的独立声明不包括支持证据,因此这是经过深思熟虑的 对权威的呼吁。 即使在 OpenJDK 本身中,我们也可以看到类似 return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; 的代码,它表明 MAX_ARRAY_SIZE 不但有 实际 用途。)

原文由 Pacerier 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题