2013-04-06 3 views
1

Я использовал LinkedBlockingQueue и недавно изменил это на ArrayBlockingQueue из-за медленной производительности вставки. После этого я получил значительное улучшение производительности. Тем не менее, мой код иногда выбрасывает из-из-памяти сообщение об ошибке:Ошибка OutOfmemory при создании ArrayBlockingQueue с записями Integer.MAX_VALUE

Мой код 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(); 
} 

Это не догадывается начальную емкость или создает очереди с минимальной мощностью. Потому что он будет меняться в зависимости от времени пик и нормального времени. Если я даю минимальную емкость, очередь будет немедленно заполнена в часы пик. Если я даю максимальную емкость, я получаю ошибку из памяти, и я не хочу выделять объект [] перед вставкой элементов.

Пожалуйста, предложите любую альтернативу.

+1

Просто запустите Java с большей памятью? '-Xmx 32G' или что-то еще. Кроме того, как еще вы собираетесь создавать общий ArrayBlockingQueue? – Sanchit

ответ

5

Удалить аргумент конструктору. Почему ваша очередь нуждается в такой большой емкости? Начните с разумным количеством, как 10 или 100 или 1000.

Этой линией смешно:

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

Вам не нужен начальный потенциал 2147483647. Это 2 Гб только для очереди!

+0

Это фиксированная емкость. Очередь будет заполнена быстро. – kannanrbk

+1

Не с записью 2GB это не будет. Идея состоит в том, чтобы добавить пул потребителей, которые реагируют достаточно быстро, чтобы очередь не была заполнена. Если он заполняется, производители блокируются до освобождения комнаты. Вот как работают очереди. – duffymo

Смежные вопросы