2

を使用していましたが、挿入パフォーマンスが遅いため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();
}

これは、初期容量を推測したり、最小容量でキューを作成したりしません。ピーク時と通常時で変動しますので。最小容量を指定すると、ピーク時にキューがすぐにいっぱいになります。最大容量を指定すると、メモリ不足エラーが発生し、要素を挿入する前にオブジェクト [] を割り当てたくありません。

代替案を提案してください。

4

1 に答える 1

6

コンストラクターへの引数を削除します。キューにそれほど多くの容量が必要なのはなぜですか? 10、100、1000 などの適切な数から始めます。

この行はばかげています:

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

2147483647 の初期容量は必要ありません。これはキューのためだけに 2GB です!

于 2013-04-06T08:23:23.267 に答える