Java util priorityQueue实现

时间:2015-06-27 06:47:54

标签: java priority-queue

以下是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;

}

1 个答案:

答案 0 :(得分:0)

此上下文中的VM引用JVM(Java虚拟机),即执行Java字节代码的软件。

这个软件有几种不同的实现方式(今天最值得注意的是 - Oracle和OpenJDK&#39; s)。这些实现中的一些可以为了内部目的向阵列添加一些额外的存储器(例如,跟踪垃圾收集)。由于JDK尝试尽可能通用,并且可以在任何JVM上运行,因此需要采取预防措施,并且不允许您创建在内部使用长于Integer.MAX_VALUE - 8的数组的PriorityQueue。