我一直在使用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 []。

请提出其他选择。

最佳答案

删除构造函数的参数。为什么您的队列需要那么多容量?以合理的数字开头,例如10或100或1000。

这行很荒谬:

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


您不需要2147483647的初始容量。仅2 Gb即可用于队列!

09-07 00:08