2

我一直在使用LinkedBlockingQueue,最近ArrayBlockingQueue由于插入性能缓慢而将其更改为。在那之后我得到了显着的性能提升。但是,我的代码有时会引发内存不足错误:

我的 Java 代码

ArrayBlockingQueue<String> s = new ArrayBlockingQueue<String>(Integer.MAX_VALUE);

我查看了ArrayBlockingQueue源代码。真的,我很震惊——它object[]为给定的初始容量分配了一个。这就是内存不足错误的原因。

ArrayBlockingQueue 源代码

public ArrayBlockingQueue(int capacity, boolean fair) {
    if (capacity <= 0)
        throw new IllegalArgumentException();
    this.items = (E[]) new Object[capacity];
    lock = new ReentrantLock(fair);
    notEmpty = lock.newCondition();
    notFull =  lock.newCondition();
}

这不会猜测初始容量或创建具有最小容量的队列。因为高峰时间和正常时间会有所不同。如果我提供最小容量,队列将在高峰时段立即填满。如果我给出最大容量,则会出现内存不足错误,并且我不想在插入元素之前分配 object[]。

请提出任何替代方案。

4

1 回答 1

6

删除构造函数的参数。为什么您的队列需要这么多容量?从一个合理的数字开始,比如 10 或 100 或 1000。

这条线很荒谬:

ArrayBlockingQueue<String> s = new ArrayBlockingQueue<String>(Integer.MAX_VALUE);

您不需要 2147483647 的初始容量。这只是队列的 2GB!

于 2013-04-06T08:23:23.267 回答