Я использовал 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();
}
Это не догадывается начальную емкость или создает очереди с минимальной мощностью. Потому что он будет меняться в зависимости от времени пик и нормального времени. Если я даю минимальную емкость, очередь будет немедленно заполнена в часы пик. Если я даю максимальную емкость, я получаю ошибку из памяти, и я не хочу выделять объект [] перед вставкой элементов.
Пожалуйста, предложите любую альтернативу.
Просто запустите Java с большей памятью? '-Xmx 32G' или что-то еще. Кроме того, как еще вы собираетесь создавать общий ArrayBlockingQueue? – Sanchit