代码之家  ›  专栏  ›  技术社区  ›  nayakam

哪一个Java阻塞队列对于多个生产者和单个或多个消费者场景是最好的?

  •  2
  • nayakam  · 技术社区  · 17 年前

    哪一个Java阻塞队列对于多个生产者和单个或多个消费者场景是最好的?

    我正在使用LinkedBlockingQueue进行测试,但我遇到了内存错误异常。

    我正在努力实现以下目标。

    1. 生成器创建一个对象并放入队列。
    2. 使用者从队列中获取数据并将其插入数据库。将有400个生产商,我可以根据自己的意愿调整消费者。

    让我知道任何想法。

    更新

    生产者:它应该监听服务器套接字。它从套接字读取数据并构造对象(域对象)并放入队列。

    使用者:将队列中的对象插入数据库(支持Hiberant和Connection Pooling)

    这是我的真实环境。进程应该能够处理至少200条记录/秒。我正在测试进程的可伸缩性以及如何改进它。我希望这能给你个更好的主意。

    有用的链接:

    vmoptions

    Monitoring and Managing Java SE 6 Platform Applications

    BlockingQueue

    3 回复  |  直到 9 年前
        1
  •  5
  •   Adamski    17 年前

    问题不在于 Queue 您使用的实现,而不是如何处理限制生产者的问题 如果 你的消费者 不能跟上 . 一种可能的解决方案是创建 LinkedBlockingQueue 有固定的容量,让你的生产商打电话 offer(E e) ,将返回 false 如果队列已满。

    另一个可能的解决方案是相应地调整生产者和消费者的数量。

        2
  •  2
  •   Brian Agnew    17 年前

    每个生产者都是单独的线程吗?不要忘记,每个线程将为其堆栈分配(默认情况下)512K内存(在您的情况下,只需要为线程分配200MB的VM内存)。你可以通过 -Xss .

    或者,你排队的对象有多大?我觉得你没有 队列 问题和某种规模化问题一样多,例如生产商的生产速度快于消费者的消费速度。

        3
  •  1
  •   Boris Pavlović    17 年前

    似乎LinkedBlockingQueue是解决问题的最佳选择。我建议您使用开关-xx:+heapDumpOnAutofMemoryError运行您的程序,并分析转储文件以查看导致问题的原因。这样你就能更容易地解决问题了。