を使用していましたが、挿入パフォーマンスが遅いため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();
}
これは、初期容量を推測したり、最小容量でキューを作成したりしません。ピーク時と通常時で変動しますので。最小容量を指定すると、ピーク時にキューがすぐにいっぱいになります。最大容量を指定すると、メモリ不足エラーが発生し、要素を挿入する前にオブジェクト [] を割り当てたくありません。
代替案を提案してください。