我刚刚开始了解如何使用 BlockingQueue(数组或链接),我想知道排队如何影响资源(CPU、内存等)?
满队列达到什么大小时就会开始成为服务器的问题(不是线程数量方面,而是比例方面)?
最佳答案
BlockingQueue 的目的是将生产者与消费者分离。当消费者速度受到限制时(通常是由于 CPU、I/O 吞吐量或只是为了减少生产者延迟),通常会选择此选项。
使用队列可以提高生产者速度,但需要维护队列所需的内存和开销。
队列所需的内存通常近似于 ItemCount * ItemSize(加上一些开销)。 BlockingQueue 的实现确实提供了容量限制,以防止无限增长;但是,如果达到容量,通常可能会发生生产者的严重限制。
队列不平衡的主要因素是元素生产的峰值速率、元素消耗的稳定速率以及峰值的数量(元素数量)。计算这些将为您提供预计积压的数量,包括时间和#个项目。
对于现代计算机,可用内存和可实现的队列大小非常大。然而,大量积压或大量未提交的业务数据可能是非常不受欢迎的。
一般来说,在以下情况下应仔细检查排队解决方案:
- 如果没有明确的流程边界来确保积压的完成,积压(处理时间)可能会大大超过原始生产流程。
- 可能会出现大量未提交的业务数据。
- 积压的工作量可能会接近可用堆的大小。
所有速率和尺寸因素取决于您的具体应用。然而,这些是一些一般原则,应该有助于分析和理解排队解决方案。
关于java - BlockingQueue资源消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42686216/