源码

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

会发现为什么他的大小是Integer.MAX_VALUE-8
而不是Integer.MAX_VALUE。

他的注释我感觉很模糊:

要分配的数组的最大大小。一些虚拟机在数组中保留一些头字。
尝试分配更大的数组可能会导致
OutOfMemoryError:请求的数组大小超过了虚拟机的限制

我翻阅了stackoverFlowIbm开发者社区
找到了相关的资料
ibm开发者社区
这个画质太糊了

会发现Array对象多了一个size,占了64bit, 也就是8字节。
ArrayList对象的形状和结构与标准的Java对象类似。主要区别在于ArrayList对象有一个额外的元数据,用于表示ArrayList的大小

参考文献

https://developer.ibm.com/articles/j-codetoheap/

分类: java

站点统计

  • 文章总数:315 篇
  • 分类总数:20 个
  • 标签总数:193 个
  • 运行天数:1156 天
  • 访问总数:40485 人次

浙公网安备33011302000604

辽ICP备20003309号