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