【问题标题】:Java util priorityQueue implementationJava util priorityQueue 实现
【发布时间】:2015-06-27 06:47:53
【问题描述】:

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

为什么有些虚拟机会在数组中保留一些标题字?那是干什么用的?这些虚拟机到底是什么?

在这个cmets下面,这里是容量大于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;

}

【问题讨论】:

    标签: java priority-queue


    【解决方案1】:

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

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

    【讨论】:

    • 我可以理解虚拟机以及将一些附加信息存储到数组中的目的。我无法理解的是在这个 cmets 之后,在 hugeCapacity 函数中,当 minCapacity &gt; MAX_ARRAY_SIZE 时,他们将`newCapacity` 设置为 Integer.MAX_VALUE 我认为这与这个 cmets 有冲突。我将编辑问题以添加此代码。
    • 64 位地址空间可以允许数组大于 Integer.MAX_VALUE 的项目数。所以 PriorityQueue 中的这种限制似乎是错误的。是仅限 PriorityQueue 还是所有 Java 数组的限制?
    • @SergeRogatch Java 语言规范不允许数组大于 Integer.MAX_VALUE 元素。字长与它无关。
    猜你喜欢
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多