java - BlockingQueue资源消耗

标签 java multithreading threadpool

我刚刚开始了解如何使用 BlockingQueue(数组或链接),我想知道排队如何影响资源(CPU、内存等)?

满队列达到什么大小时就会开始成为服务器的问题(不是线程数量方面,而是比例方面)?

最佳答案

BlockingQueue 的目的是将生产者与消费者分离。当消费者速度受到限制时(通常是由于 CPU、I/O 吞吐量或只是为了减少生产者延迟),通常会选择此选项。

使用队列可以提高生产者速度,但需要维护队列所需的内存和开销。

队列所需的内存通常近似于 ItemCount * ItemSize(加上一些开销)。 BlockingQueue 的实现确实提供了容量限制,以防止无限增长;但是,如果达到容量,通常可能会发生生产者的严重限制。

队列不平衡的主要因素是元素生产的峰值速率、元素消耗的稳定速率以及峰值的数量(元素数量)。计算这些将为您提供预计积压的数量,包括时间和#个项目。

对于现代计算机,可用内存和可实现的队列大小非常大。然而,大量积压或大量未提交的业务数据可能是非常不受欢迎的。

一般来说,在以下情况下应仔细检查排队解决方案:

  • 如果没有明确的流程边界来确保积压的完成,积压(处理时间)可能会大大超过原始生产流程。
  • 可能会出现大量未提交的业务数据。
  • 积压的工作量可能会接近可用堆的大小。

所有速率和尺寸因素取决于您的具体应用。然而,这些是一些一般原则,应该有助于分析和理解排队解决方案。

关于java - BlockingQueue资源消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42686216/

相关文章:

java - Thread Main 中的异常 : ClassNotFoundException

通过gmail smtp服务器通过java发送邮件时出现java.net.SocketException

multithreading - WaitForMultipleObjects 与 CRITICAL_SECTION

c++ - unique_lock 与使用互斥锁相比有什么特殊用途?

python - 如何在 Python eventlet 中停止协程/线程

java - 具有延迟的自定义 ThreadPoolExecutor

java - java小程序可以在我的电脑上访问什么网页?

java - 通过应用程序发送短信

java - Reactor 2.0 中的多线程 - 为什么我不能将信号输出到多个线程

java线程同步: i get "undefined value"