【Java基础】ArrayList的容量上限?为什么Integer.MAX_VALUE要减8?

2023-05-16

目录

  • ArrayList容量上限
  • 为什么要减8?
  • 参考

ArrayList容量上限

我们知道ArrayList维护了一个int整型的数组容量size:

    /**
     * Returns the number of elements in this list.
     *
     * @return the number of elements in this list
     */
    public int size() {
        return size;
    }

    /**
     * Returns {@code true} if this list contains no elements.
     *
     * @return {@code true} if this list contains no elements
     */
    public boolean isEmpty() {
        return size == 0;
    }

正常说来,int整型的范围不超过2^31-1,也就是Integer.MAX_VALUE,所以ArrayList容量上限就是Integer.MAX_VALUE吗?不是的。

查看ArrayList源码可以发现

	/**
	 * The maximum size of array to allocate (unless necessary).
	 * 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;
	

所以ArrayList容量上限是Integer.MAX_VALUE - 8

为什么要减8?

因为自己作为数组,除了存储数据本身以外,还需要32 bytes的大小来存储对象头(object header)信息。Java每个对象都包含了对象头,HotSpot虚拟机中对象头的大小不会超过32 bytes,所以最大容量减8才不会溢出。

我们知道,Java对象在堆内存中的存储布局可以分为三部分:对象头(object header),实例数据(Instance Data)和对齐填充(Padding)。

在这里插入图片描述

对象头包括:

  1. Mark Word:用于对象自身的运行时数据存储,如HashCode,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID和偏向时间戳等;
  2. Klass Pointer:对象指向它类元数据的指针,JVM通过这个指针长度来确定对象是哪个类的实例。
  3. 数组长度(只有数组对象才有):记录数组对象的长度。

在这里插入图片描述

我们知道 8 int(整数) 就等于32 bytes(字节),所以减去对象头大小的32 bytes来源于:

32 bytes = 8 bytes(Mark Word的最大占用) + 8 bytes(Klass Pointer的最大占用) + 4 bytes(数组长度)+ 8 bytes(引用指针的最大占用:数组中存放的是对象的引用) + 4 bytes(padding:为了方便寻址,JVM要求对象大小要求是8的倍数,不够就填充)

参考

https://www.cnblogs.com/silyvin/p/11721144.html

https://blog.csdn.net/yangshangwei/article/details/106958768

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java基础】ArrayList的容量上限?为什么Integer.MAX_VALUE要减8? 的相关文章

  • android网络时间同步总结

    本文转自 xff1a http www cnblogs com hoji real archive 2011 11 14 2247984 html 最近看了下网络时间同步 xff0c 总结一下 整体描述 xff1a android网络时间同
  • win7删除ubuntu系统

    win7 43 ubuntu双系统 xff0c ubuntu开机的时候 xff0c 电脑会响 xff0c ubuntu系统进不去 进入win7系统后 xff0c F盘是通过磁盘管理压缩剩余空间安装ubuntu系统的 xff0c QQ安装在F
  • 手机电池和taskId的寻找

    刷机的时候启动手机时间比较久 xff0c 拔掉电池给手机断电 xff0c 启动的比较快一点 一直这样干 xff0c 一段时间以后 xff0c 手机充电的时候 xff0c 会显示bad battery 提示电池坏掉 电池坏掉后 xff0c 刷
  • Objective-c的内存管理MRC与ARC

    Objective c中提供了两种内存管理机制MRC xff08 MannulReference Counting xff09 和ARC Automatic Reference Counting xff0c 分别提供对内存的手动和自动管理
  • 修复:connectToBus() Connection Error(Using X11 for dbus-daemon autolaunch was disabled at compile time

    1 问题 xff1a d bus 在 dbus daemon 没有运行起来的环境中会报这个错 xff1a connectToBus Connection Error Using X11 for dbus daemon autolaunch
  • Git 初体验

    文章目录 1 文章结构2 Git安装3 个人开发3 1 怎么理解SSH xff1f 3 2 SSH场景3 2 1 场景13 2 2 场景23 2 3 场景3 3 3 怎么理解HTTPS xff1f 4 公司开发5 小二总结 上篇文章 xff
  • 一年一度的1024,一周一次的每周思考,来点碰撞

    时间过得真快呀 xff0c 又到了著名的 程序员节 最近在整理任务的时候 xff0c 发现列表中还藏着这样一条 在科技日益发达的今天 xff0c 恰逢 程序员节 xff0c 小二不免又产生了一些思考 前几年 xff0c 老家附近修了飞机场
  • 鲲鹏HCIA系列笔记题库汇总(内含PDF)

    大家好呀 xff0c 我是小二 xff0c 好久不见 之前小二分享了几篇鲲鹏 HCIA 认证的笔记 xff0c 反响还不错 现在小二特地把几篇笔记整理成一个 PDF 文档 xff0c 方便阅读 xff0c 也方便查找 目前已经更新到 V1
  • 【每周思考-15】我是标题

    不知道写什么 xff0c 先陈述一些事实吧 C程序设计语言 本周终于看完了第一遍 xff0c 练习题正在进行 从零开始学理财 杨婧 也看完了 xff0c 实操也在慢慢进行 xff0c 周期久一点 x1f611 上周末看了 金陵十三钗 xff
  • javaweb中jstl无法解析的错误解决方法

    javaweb中jstl无法解析的错误解决方法 无法在web xml或使用此应用程序部署的jar文件中解析绝对uri xff1a http java sun com jstl core 一 问题的产生 在javaweb项目中引入了 jstl
  • 500、1000

    上周日 xff0c 是我参加工作整整 1000 天 xff0c 确实没想到 xff0c 我都已经混迹职场这么久了 周一呢 xff0c 也是距离我写第一篇公众号文章的第 500 天 xff0c 确实也没想到写这么久了 两个相比较来说 xff0
  • 说实话,想家了

    想家了 这周最大的惊喜 xff0c 就是发现1月底该过年了 xff0c 好开心啊 xff01 毕业这几年是越来越恋家 xff0c 光是想想跟家人在一块的时光 xff0c 就美滋滋的 也许是这几年发生了太多事情 xff0c 前年爸爸车祸 xf
  • 恭喜“结业”啦

    之前报名的深圳市人工智能培训 xff0c 今天上完了最后一次课 xff0c 也考完试 xff0c 拿到结业证书啦 xff0c 哈哈 这个课程是人社局主办的 xff0c 有市级 区级的培训 个人觉得挺好 xff0c 带我简单的了解下人工智能的
  • 思考,分享

    不知不觉 xff0c 每周思考也陪我跨了个年 xff0c 本篇已经是第 22 周了 写 每周思考 时 xff0c 总能让我回想起很多事情 近段时间 xff0c 大部分精力都扑在工作上了 xff0c 工作日晚上回家 xff0c 也没有写文章的
  • Git代码提交,固定日志模板

    时间 xff1a 2022年1月9日21 38 22 团队开发 xff0c 但是每个人的日志风格不同该怎么办 xff1f 通过配置服务器的 Git 提交日志 xff0c 就可以实现统一的代码提交风格 先看实现效果 xff0c 如下图 这样大
  • 《伤逝——涓生的手记》,读后有感

    看鲁迅先生的 狂人日记 有一段时间了 xff0c 其中有一短篇 xff0c 名叫 伤逝 涓生的手记 xff0c 有一些浅显的思考 xff0c 分享给大家 xff0c 可以互相讨论学习 x1f37b 参考资料 xff1a 百度百科 伤逝 xf
  • 我的2021

    牛年的事情 xff0c 肯定要在牛年结束 现在已经是 2022 年的一月份了 xff0c 才开始动笔 xff0c 写这份 2021 的年终总结 有两方面的原因 xff0c 一方面是觉得 12 月的时间太紧了 xff08 参加了培训班 xff
  • C/C++ 语言 printf 可以直接使用宏定义打印?

    hello xff0c 你好呀 xff0c 我是小二 在 编码 过程中 xff0c 小二发现一种神奇的用法 xff1a 打印时 xff0c 直接使用宏定义 xff01 于是小二决定自己尝试一把 1 基础环境 使用的在线编译器是这个 x1f4
  • Anaconda3安装教程记录

    参考资料 1 官网 xff1a https www anaconda com products individual 2 安装教程 xff1a https mp weixin qq com s ip8TQF2pyjLwEBixwoxxBw
  • Anaconda3修改默认环境保存路径

    参考链接 1 https blog csdn net javastart article details 102563461 配置方法 方法一 1 修改 C 盘 condarc 隐藏文件 xff1b 2 在文件末尾增加如下内容 envs d

随机推荐