/**
* 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;
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
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;
}
为什么这里 MAX_ARRAY_SIZE 会写成是 Integer.MAX_VALUE - 8?
注释上面说是因为 header words in an array?如果这个 header words 是说下面 so 说的情况,会多 8 个字节的话?
so上面说是因为数组对象需要多存一个 8 个字节的 size 大小,所以需要减 8?但是仅仅是在 Integer.MAX_VALUE-8 就可以省下不止 8 字节的空间把? 8 个 int 型,每个 4 个字节,应该不是可以省下 32 个字节?那不是应该-2 ?
知乎上面说只是为了避免一些机器内存溢出....所以说这个 -8 是为了减少出错的几率?只是为了减少出错的几率,所以选择少分配一些?
但是我看hugeCapacity函数,当 minCapacity > MAX_ARRAY_SIZE ,最后还是选择了 Integer.MAX_VALUE,来开辟数组,那么所以最大的情况下还是选择了 Integer.MAX_VALUE ?那么 MAX_ARRAY_SIZE 其实没有被使用到?
还有 hugeCapacity 函数如果抛出 OutOfMemoryError 的话,因为 minCapacity = size+1,所以 size 原来是 Integer.MAX_VALUE ?所以还是可以会开辟出来最大的长度是 Integer.MAX_VALUE ?那么是不是 MAX_ARRAY_SIZE 其实并没有什么意义?
其实就想问源码中 MAX_VALUE 是出于一个什么目的来进行定义的?具体是怎么使用的?为什么减 8 啊?
1
param 2017-02-25 21:04:26 +08:00 via Android
我仿佛又听到有人在背后偷偷 @我
|
4
snnn 2017-02-25 21:43:08 +08:00 1
oldCapacity :是你当前的长度
minCapacity: 是你至少需要多长 newCapacity :是你将来的长度。 显然 oldCapacity<=minCapacity<=newCapacity<=Integer.MAX_VALUE 一个基本原则:要让 newCapacity 尽可能的满足 minCapacity 。如果不能满足,一定要抛异常。 什么时候 newCapacity >= MAX_ARRAY_SIZE? 答: oldCapacity + (oldCapacity >> 1) >= MAX_ARRAY_SIZE 在这种情况下,为了防止计算溢出,干脆就让 newCapacity = MAX_ARRAY_SIZE 但是万一这样不够呢? 分两种情况:如果超出了 max int ,就抛异常。否则比如 minCapacity=Integer.MAX_VALUE - 2 ,那么就让它等于 Integer.MAX_VALUE |
6
mikulch 2017-02-26 12:06:16 +08:00
建议楼主不要纠结这些东西
编程是用来解决问题滴。 |
9
log4geek 2017-03-23 09:39:12 +08:00
Java 集合类详解及相互区别(Collection/List/LinkedList/ArrayList/Vector/Set/Map/hashMap/hashTable)
http://log4geek.cc/2016/12/java%e9%9b%86%e5%90%88%e7%b1%bb%e8%af%a6%e8%a7%a3%e5%8f%8a%e7%9b%b8%e4%ba%92%e5%8c%ba%e5%88%abcollectionlistlinkedlistarraylistvectorsetmaphashmaphashtable/ 请叫我雷锋 |
10
zhgg0 2019-09-18 15:16:57 +08:00
楼主后来弄懂了这个问题不?求解释
|