gpt4 book ai didi

spring-integration - Spring Integration - 如果 Poller 和 TaskExecutor 不协调则内存泄漏

转载 作者:行者123 更新时间:2023-12-05 07:54:07 24 4
gpt4 key购买 nike

下面Spring Integration文档的7.1.7异步轮询部分解释了如果Poller和TaskExecutor不协调可能会发生内存泄漏。但是我没看懂。

http://docs.spring.io/autorepo/docs/spring-integration/3.0.x/reference/html/messaging-endpoints-chapter.html#async-polling

<int:service-activator input-channel="publishChannel" ref="myService">
<int:poller receive-timeout="5000" task-executor="taskExecutor" fixed-rate="50"/>
</int:service-activator>

<task:executor id="taskExecutor" pool-size="20" queue-capacity="20"/>

上面的配置演示了其中一个不合时宜的配置。

The poller keeps scheduling new tasks even though all the threads are blocked waiting for either a new message to arrive, or the timeout to expire. Given that there are 20 threads executing tasks with a 5 second timeout, they will be executed at a rate of 4 per second (5000/20 = 250ms). But, new tasks are being scheduled at a rate of 20 per second, so the internal queue in the task executor will grow at a rate of 16 per second (while the process is idle), so we essentially have a memory leak.

One of the ways to handle this is to set the queue-capacity attribute of > the Task Executor to 0.

谁能详细说明一下。

我对上面代码的理解是:

池大小为 20 - 因此将执行 20 个线程。

receive-timeout 为 5 秒:因此将给 20 个线程 5 秒来完成任务。

固定速率为 50 毫秒 - 因此新任务的调度速率为每秒 20 个。

我有几个问题:

问。如果执行 20 个线程需要超过 5 秒,会发生什么情况?

问。在文档中,它所说的任务将以每秒 4 个的速度执行。但是,有些任务可能会在不到 4 秒内运行,而有些则需要更多时间。

问。它是如何导致内存泄漏的?如果没有可用的线程和队列,Executor 会根据拒绝策略拒绝它。

问。将 queue-capacity 设置为 0 有何帮助?根据我的理解,如果所有线程都忙,那么 Executor 会将它们放入队列中,直到达到队列容量。

最佳答案

文档是不正确的——只有当你有一个无界队列并且消息处理跟不上时才会发生内存泄漏。我开了一个JIRA Issue进行更正。

关于spring-integration - Spring Integration - 如果 Poller 和 TaskExecutor 不协调则内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31719472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com