Java 中 arrayList 最大容量是 Integer.MAX_VALUE-8

2017-05-10 14:50:12 +08:00
 a895259846
为什么 java 中 arrayList 最大容量是 Integer.MAX_VALUE-8 ?

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}

private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}

虽然定义减少 8 位,但是后面如果还是不够用,那么还是可以继续扩容的。为何定位减少 8 ?为何能扩容?
目前解释:①存储 Headerwords ;②避免一些机器内存溢出,减少出错几率,所以少分配③最大还是能支持到 Integer.MAX_VALUE
最终还是有疑问:如果集合容量无限接近最大值,那么官方解释中集合存储的 HeaderWords 呢,难道被清除掉了?
3246 次点击
所在节点    程序员
6 条回复
a895259846
2017-05-10 14:51:23 +08:00
有大神来回答没?
woshixiaohao1982
2017-05-10 14:57:51 +08:00
@a895259846 应该是连续内存寻址的问题,
因为 x86 寻址是有限制的,例如 32 位 最大内存地址是 4G 所以一个进程最多只有 4G 的虚拟内存地址空间,

64 位最大寻址空间是 128G
如果超过的话,就会写入硬盘缓存,当你访问的时候 被缓存到硬盘上的内容 会触发页中断 ,如果频繁的页中断,会使得系统变慢
woshixiaohao1982
2017-05-10 15:01:18 +08:00
@a895259846 这里的超过不是指超过 4G 或者 128G 而是指应用态的程序 虚拟内存实际使用超过了物理内存的大小,这个时候就会缓存部分暂时不用的内存内容到硬盘等低速存储空间内
woshixiaohao1982
2017-05-10 15:05:39 +08:00
@a895259846 另外每个体系架构的总线是不确定的,https://www.zhihu.com/question/29962475
SoloCompany
2017-05-11 02:47:02 +08:00
sagaxu
2017-05-11 09:33:23 +08:00
@woshixiaohao1982 64 位才 128G?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/360381

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX