以下是java.util.PriorityQueue(java 1.7)源代码中我不理解的注释。
/**
* 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;
为什么有些VM会在数组中保留一些标题字?那用的是什么?这些虚拟机究竟是什么?
在此评论下方,此处是容量大于MAX_ARRAY_SIZE
private void grow(int minCapacity) {
int oldCapacity = queue.length;
// Double size if small; else grow by 50%
int newCapacity = oldCapacity + ((oldCapacity < 64) ?
(oldCapacity + 2) :
(oldCapacity >> 1));
// overflow-conscious code
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
queue = Arrays.copyOf(queue, newCapacity);
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
//why return Integer.MAX_VALUE ? Would this throw an exception in some certain VMs?
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
答案 0 :(得分:0)
此上下文中的VM引用JVM(Java虚拟机),即执行Java字节代码的软件。
这个软件有几种不同的实现方式(今天最值得注意的是 - Oracle和OpenJDK&#39; s)。这些实现中的一些可以为了内部目的向阵列添加一些额外的存储器(例如,跟踪垃圾收集)。由于JDK尝试尽可能通用,并且可以在任何JVM上运行,因此需要采取预防措施,并且不允许您创建在内部使用长于Integer.MAX_VALUE - 8
的数组的PriorityQueue。