【发布时间】:2023-03-08 03:34:01
【问题描述】:
我必须从 Do Java arrays have a maximum size? 数组大小有最大限制。
可能是为了耗尽堆空间。是的,我同意这一点。
我无法理解以下内容:
但是为什么要对每个数组都有这个限制呢?
如果我有许多如此大的数组怎么办?
为什么在总体达到堆空间的某个阈值(总消耗)时不抛出异常,而不是为每个数组设置上限?
注意:
在 Python 中,他们有这个限制 How Big can a Python Array Get?
在 C 中,似乎没有限制(使用的硬件除外)The maximum size of an array in C
【问题讨论】:
-
与堆空间无关。全部与使用 32 位整数进行寻址有关。
-
并且数组空间必须是连续的。在 JVM 启动时分配 2GB 数组可能相对容易,但在具有碎片堆(取决于您的 GC 实现)的长时间运行的应用程序中,这几乎是不可能的。
-
但是为什么呢?数组是否设计为索引范围更大,这可能吗?我可以知道为什么愚蠢的索引是这种功能的限制因素。为了实用,就像说“因为这个人的名字只有六个字符,他只能学习到第 6 个标准”来自教科书sonline.tn.nic.in/Books/11/Std11-CompSci-EM-2.pdf 第 257 页我得到感觉只有地址很重要,索引仅用于从起始地址计算下一个地址。那么为什么这个索引如此重要并作为数组大小的限制因素。 ——
-
有趣的推论:
ArrayList的所有操作实际上都是 O(1),尽管我们认为它们是 O(N)。例如,contains(Object)是 O(1),因为我可以得出一个常数 (2^31-1),它是 JLS 强制执行的上限,表示它将采取多少步(带有一些常数乘数)。 :) (但不要在任何测试或面试中说它是 O(N)!)
标签: java stack heap-memory