java - 如何估计或计算 ArrayBlockingQueue 的大小

标签 java multithreading queue

如标题所示,在我的模块中,我有一个阻塞队列来传送我的数据。服务器能够产生的数据是大量的日志信息。为了避免影响服务器的性能,我编写了多线程客户端来消费这些数据并将它们持久化在数据缓存中。因为每分钟可以产生大量数据,所以我开始困惑应该初始化队列的大小。而且我知道我可以设置我的队列策略,如果产生更多数据,我可以省略溢出部分。但是为了尽可能多地保存这些数据,我在队列中创建了多少大小。

你能给我一些建议吗?据我所知,这与我的服务器 JVM 堆栈大小和我的 JVM 中的单个日志记录数据有关???

最佳答案

让它“尽可能大”。例如,如果您可以接受它最多消耗 1Gb 的内存,则将其大小分配为 1Gb 除以队列中对象的平均字节数。

如果我必须选择一个“合理”的数字,我会从 10000 开始。原因是,如果它变得更大,那么让它变得更大并不是一个好主意,也不会有太大帮助,因为显然日志记录要求超过了您的日志记录能力,所以是时候退出了客户。

通过实验“调整”通常是最好的方法,因为它取决于您的应用程序的配置文件:

  • 如果应用程序的 Activity 有高有低,那么更大的队列将有助于“消除”服务器上的负载
  • 如果您的应用程序具有相对稳定的负载,那么较小的队列是合适的,因为较大的队列只会延迟客户端被阻塞时不可避免的点 - 您最好将其变小并投入更多资源(几个更多的日志记录线程)来消耗工作。

另请注意,非常大的队列可能会影响垃圾收集对释放内存的响应,因为它每次运行时都必须遍历更大的堆(队列中的所有对象),从而增加 CPU 和内存的负载.

您希望在不对吞吐量和响应能力产生太大影响的情况下尽可能减小尺寸。要对此进行评估,您需要设置一个测试服务器并用典型负载对其进行测试以查看会发生什么。请注意,您可能需要从多台机器上加载它以在服务器上施加实际负载,因为从一台机器上加载它可能会由于测试客户端机器上的 CPU 内核和其他资源数量而限制负载。

坦率地说,我只是将大小设置为 10000 并调整工作线程的数量而不是队列大小。

关于java - 如何估计或计算 ArrayBlockingQueue 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7958567/

相关文章:

java - jsp中分页公告板的sql

java - 使布局不可点击但子元素可点击

java - 在 A17-Realtag-BLE-Sensor-Wearable 上获取温度或压力

Jenkins - 如何暂停排队作业的运行并让新构建优先

objective-c - 串行调度队列中的 block 未执行 - GCD iOS Objective-C

java - 如何将 2 个 JSP 页面链接在一起?

java - Java 中的同步 - Thinking in Java 示例

生成器生成的 Python 3 队列,由多进程消耗

java - 使用ExecutorService并行处理任务

mongodb - 延迟排队解决方案