Альтернативы LinkedBlockingQueue для JDK 6

Я использую LinkedBlockingQueue для моего threadPool

new ThreadPoolExecutor(20, 
                       21, 
                       10,
                       TimeUnit.SECONDS, 
                       new LinkedBlockingQueue())

и я страдаю от утечки памяти Ошибка (в памяти полно узлов LinkedBlockingQueue, медленное замедление), что зафиксировано в JDK 7.

На данный момент я не хочу менять среду выполнения или мой JDK.

LinkedBlockingQueue не имеет ограничения по размеру, в отличие от других реализаций интерфейса BlockingQueue. Можете ли вы предложить альтернативную очередь?

2
добавлено
Просмотры: 2
nl ja de
Вы хотите, чтобы производитель выбросил исключение, если потребитель слишком медленный? Если у вас есть задачи, живущие так долго, они становятся влажными, у вас есть серьезная проблема. ИМХО вы просто гарантируете, что потребитель всегда быстрее, чем производитель.
добавлено автор Peter Lawrey, источник
Поскольку ошибка, по-видимому, исправлена ​​в используемой вами версии, я бы искал другие объяснения.
добавлено автор Peter Lawrey, источник
Вы также можете использовать ThreadPoolExecutor.CallerRunsPolicy в том случае, если потребитель медленный (даже временно). Это может позволить вам установить размер довольно маленьким. Если у вас есть 20 потоков, очередь должна быть пустой большую часть времени. Вы можете попробовать SynchronousQueue
добавлено автор Peter Lawrey, источник
@PeterLawrey У меня нет проблемы с балансом скорости, это просто утечка памяти связанного сложения в стеке, поскольку это процесс демона
добавлено автор kommradHomer, источник
@PeterLawrey, я так считаю. Я думаю, что я попытаюсь использовать реализацию фиксированного размера в конечном итоге
добавлено автор kommradHomer, источник

2 ответы

Исправленный идентификатор ошибки, на который вы ссылаетесь, также был обращен к Java 6. Он был исправлен в Java 6 с момента обновления Java 6 Update 19, см. http://bugs.sun.com/view_bug.do?bug_id=2186685 (этот BTW связан с ошибкой, о которой вы говорите).

4
добавлено
Спасибо. Думаю, я узнаю еще один момент о том, как читать информацию об ошибке. Список уязвимых версий поможет мне «6u11,6u22,7». Есть ли способ применить это исправление ошибки к моей среде выполнения? моя система говорит «java-версия» 1.6.0_32 «'
добавлено автор kommradHomer, источник
Java (TM) SE Runtime Environment (сборка 1.6.0_32-b05)
добавлено автор kommradHomer, источник
@kommradHomer Я считаю, что список 6u22 в затронутых версиях неверен; какова фактическая версия JRE, которую вы используете?
добавлено автор Mark Rotteveel, источник
Он указан как исправленный в релиз-уведомлениях Java 6 Update 19, а также </а>
добавлено автор Mark Rotteveel, источник

ArrayBlockingQueue which is backed by a fixed-sized array.

PriorityBlockingQueue - it is an unbounded blocking, here the elements of the priority queue are ordered according to their natural ordering, or by a Comparator provided at queue construction time.

2
добавлено
+1 Вы также можете использовать LinkedBlockingQueue с фиксированной емкостью.
добавлено автор Peter Lawrey, источник