我一直在使用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();
}
这不会猜测初始容量或创建具有最小容量的队列。因为它会在高峰时间和正常时间变化。如果我提供最小容量,队列将在高峰时段立即填写。如果我给出最大容量,我会得到一个内存不足的错误,我不想在插入元素之前分配一个对象[]。
请建议任何替代方案。
答案 0 :(得分:5)
删除构造函数的参数。为什么你的队列需要那么大的容量?从合理的数字开始,如10或100或1000。
这条线很荒谬:
ArrayBlockingQueue<String> s = new ArrayBlockingQueue<String>(Integer.MAX_VALUE);
您不需要初始容量2147483647.这只是队列的2GB!