当前位置: 首页 > 面试题库 >

为什么ArrayList的最大数组大小为Integer.MAX_VALUE-8?

叶文博
2023-03-14
问题内容

我正在学习Java 8文档ArrayList。我知道最大数组大小定义为Integer.MAX_VALUE - 8均值2 ^ 31 – 8 =
2147483639 。然后,我集中讨论了为什么要减去8 why not less than 8more than 8减去?

/**
 * 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;

有些人根据文档给出了一些逻辑"Some VMs reserve some header words in anarray"。因此,对于标题字,减去8。但是在这种情况下,如果标题字需要大于8,那么答案是什么?

请在此基础上澄清我。预先感谢您的合作。


问题答案:

阅读上述有关Java内存管理的文章,其中清楚指出

我认为这适用于ArrayList,因为它是Resizable array的实现。

Java数组对象的剖析

数组对象(例如int值的数组)的形状和结构与标准Java对象的形状和结构相似。主要区别在于,数组对象还有一个额外的元数据,它表示数组的大小。然后,数组对象的元数据包括:Class:指向类信息的指针,该信息描述对象的类型。对于int字段数组,这是指向int
[]类的指针。

标志:描述对象状态的标志的集合,包括对象的哈希码(如果有的话)以及对象的形状(即,对象是否为数组)。

Lock:对象的同步信息,即对象当前是否同步。

Size:数组的大小。

最大尺寸

2^31 = 2,147,483,648

作为数组,它本身需要8 bytes存储大小 2,147,483,648

所以

2^31 -8 (for storing size ),

因此最大数组大小定义为Integer.MAX_VALUE-8



 类似资料:
  • null 请在此基础上向我澄清。谢谢你的合作。

  • 我有点惊讶地看到为什么在我的机器上,数组的最大大小是整数.MAX_VALUE/7 我知道数组是由整数索引的,所以数组大小不能大于整数.MAX_VALUE。我还阅读了一些堆栈溢出讨论,我发现它在JVM上有所不同,并且JVM使用了一些(5-8咬)。 在这种情况下,最大值也应为。 和 之间的任何值都会给我错误: 这是我可以分配给机器上数组的最大值。具体原因是什么? 更新:我正在运行eclipse中的代码

  • 问题内容: Java中的数组的长度是固定的。Java为什么要允许大小为0的数组呢? 问题答案: 它表示它为空。即您可以遍历它,就好像它有项目并且没有结果发生一样: 从而避免了检查的需要。如果所讨论的数组为,则会发生异常,但是在这种情况下,它什么也不做,这可能是适当的。

  • 我碰到了R的< code>range函数。它确实是一个有用的工具,并使代码更具可读性,但是如果用一个简单的包含< code>min和< code>max的一行程序来代替它,它的速度可以提高一倍。 我做了一些基准测试,range函数的“糟糕”性能让我吃惊。为了进行比较,我编写了一个名为< code>range2的函数,它使用了min和max(参见代码)。除了速度之外,如果一个简单的一行程序可以胜过这

  • 问题内容: 这是 不是 增加Java的堆的最大尺寸的虚拟机启动后。技术原因是什么?垃圾回收算法是否取决于要使用固定数量的内存?还是出于安全原因,通过消耗所有可用内存来防止Java应用程序从DOS的系统中移至其他应用程序? 问题答案: 最后我知道在Sun的JVM中,必须在连续的地址空间中分配整个堆。我想对于大堆值,很难在启动后将其添加到您的地址空间中,同时又要确保它保持连续。您可能需要在启动时获取它

  • 我需要找到总和大于或等于< code>k的最小子阵列长度。数组将只有正数。 例如 输入:< code>target = 7,< code>nums = [2,3,1,2,4,3]输出:2说明:子数组[4,3]在问题约束下长度最小。 在我的代码中,对于输入:< code>target = 7,< code>nums = [2,3,1,2,4,3]我得到的答案是< code>3,但正确答案是< cod