我一直在使用LinkedBlockingQueue
,並且最近由於插入性能低而將其更改爲ArrayBlockingQueue
。那之後我獲得了顯着的性能提升。然而,我的代碼的某個時候拋出內存外的一個錯誤:使用Integer.MAX_VALUE條目創建ArrayBlockingQueue時發生OutOfmemory錯誤
我的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();
}
這並不猜測初始容量或創建具有最小容量的隊列。因爲它在高峯時間和正常時間會有所不同。如果我給出最小容量,隊列將在高峯時間立即填充。如果我給出最大容量,則會出現內存不足錯誤,並且在插入元素之前我不想分配對象[]。
請提出任何替代方案。
剛剛啓動更多內存的Java? '-Xmx 32G'或其他。另外,你還將如何創建一個通用的ArrayBlockingQueue? – Sanchit 2013-04-06 08:25:11