【问题标题】:Preventing ConcurrentLinkedQueue<T> from outofmemory Exception防止 ConcurrentLinkedQueue<T> 出现内存不足异常
【发布时间】:2010-10-26 08:25:32
【问题描述】:

使用 ConcurrentLinkedQueue 时,如何限制队列的大小。是否有可能通过内存不足异常?

【问题讨论】:

    标签: java queue out-of-memory


    【解决方案1】:

    ConcurrentLinkedQueue 的大小是无限的,所以如果生产者放入物品的速度快于消费者取出物品的速度,最终它确实会吃掉你的记忆。如果要限制队列的大小,请尝试使用阻塞队列,例如 LinkedBlockingQueue 或 ArrayBlockingQueue。第一个的大小可以有选择地有界,而第二个总是有界的。

    【讨论】:

    • 感谢您的回答,但是我使用 ConcurrentLinkedQueue 因为它是并发的,您是否建议在访问这些变量时需要我添加同步的非并发类?
    • @Youval,所有BlockingQueue 实现都是线程安全的,正如the API docs 中所声明的那样。
    • 然而,阻塞线程可能会影响高并发应用程序中的整体应用程序性能。所以有利有弊。
    【解决方案2】:

    我在这方面有点晚了,但是你总是可以设置一个上限,当超过时,你的方法将消耗一个令牌来为下一个腾出空间,依此类推。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多