使用Integer.MAX_VALUE条目创建ArrayBlockingQueue时出现OutOfmemory错误

kan*_*rbk 1 java collections performance memory-management capacity

我一直在使用LinkedBlockingQueue,最近ArrayBlockingQueue由于插入性能缓慢而改变了这一点.之后我获得了显着的性能提升.但是,我的代码有时会抛出一个内存不足的错误:

我的Java代码

ArrayBlockingQueue<String> s = new ArrayBlockingQueue<String>(Integer.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)

我查看了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();
}
Run Code Online (Sandbox Code Playgroud)

这不会猜测初始容量或创建具有最小容量的队列.因为它会在高峰时间和正常时间变化.如果我提供最小容量,队列将在高峰时段立即填写.如果我给出最大容量,我会得到一个内存不足的错误,我不想在插入元素之前分配一个对象[].

请建议任何替代方案.

duf*_*ymo 5

删除构造函数的参数.为什么你的队列需要那么大的容量?从合理的数字开始,如10或100或1000.

这条线太荒谬了:

ArrayBlockingQueue<String> s = new ArrayBlockingQueue<String>(Integer.MAX_VALUE);
Run Code Online (Sandbox Code Playgroud)

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