哪种Java阻止队列最适合多个生产者和单个或多个消费者场景?
我正在使用LinkedBlockingQueue进行测试,但我收到了OutOfMemoryError异常。
我正在努力实现以下目标。
让我知道任何想法。
更新
制作人:应该收听Server Socket。它从socket&读取数据。构造对象(Domain对象)并放入队列。
消费者:从队列中获取对象&插入数据库(支持Hiberante&连接池)
这是我的真实环境。流程应该能够处理至少200条记录/秒。我正在测试流程的可扩展性以及如何改进它。我希望这会给出更好的主意。
有用的链接:
答案 0 :(得分:5)
问题不在于您使用Queue
实施,而是如何解决限制生产者的问题如果您的消费者无法跟上。一种可能的解决方案是创建具有固定容量的LinkedBlockingQueue
,让生产者调用offer(E e)
,如果队列已满,将返回false
。
另一种可能的解决方案是随意调整生产者和消费者的数量。
答案 1 :(得分:2)
每个生产者都是一个单独的线程吗?不要忘记每个线程将为其堆栈分配(默认情况下)512k的内存(在您的情况下,仅需要为线程提供200Mb的VM内存)。您可以通过-Xss
。
或者,您排队的对象有多大?我不认为你有一个队列问题,就像某种扩展问题一样 - 例如生产者生产速度快于消费者可以消费的。
答案 2 :(得分:1)
似乎LinkedBlockingQueue是您问题的最佳选择。我建议你使用开关-XX运行程序:+ HeapDumpOnOutOfMemoryError并分析转储文件以查看导致问题的原因。然后你就能够更容易地解决它。