V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
a895259846
V2EX  ›  程序员

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

  •  
  •   a895259846 · 2017-05-10 14:50:12 +08:00 · 3236 次点击
    这是一个创建于 2545 天前的主题,其中的信息可能已经有所发展或是发生改变。
    为什么 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 呢,难道被清除掉了?
    a895259846
        1
    a895259846  
    OP
       2017-05-10 14:51:23 +08:00
    有大神来回答没?
    woshixiaohao1982
        2
    woshixiaohao1982  
       2017-05-10 14:57:51 +08:00
    @a895259846 应该是连续内存寻址的问题,
    因为 x86 寻址是有限制的,例如 32 位 最大内存地址是 4G 所以一个进程最多只有 4G 的虚拟内存地址空间,

    64 位最大寻址空间是 128G
    如果超过的话,就会写入硬盘缓存,当你访问的时候 被缓存到硬盘上的内容 会触发页中断 ,如果频繁的页中断,会使得系统变慢
    woshixiaohao1982
        3
    woshixiaohao1982  
       2017-05-10 15:01:18 +08:00
    @a895259846 这里的超过不是指超过 4G 或者 128G 而是指应用态的程序 虚拟内存实际使用超过了物理内存的大小,这个时候就会缓存部分暂时不用的内存内容到硬盘等低速存储空间内
    woshixiaohao1982
        4
    woshixiaohao1982  
       2017-05-10 15:05:39 +08:00
    @a895259846 另外每个体系架构的总线是不确定的,https://www.zhihu.com/question/29962475
    SoloCompany
        5
    SoloCompany  
       2017-05-11 02:47:02 +08:00
    sagaxu
        6
    sagaxu  
       2017-05-11 09:33:23 +08:00 via Android
    @woshixiaohao1982 64 位才 128G?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5367 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 08:40 · PVG 16:40 · LAX 01:40 · JFK 04:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.