java内存泄漏,因为接收超时和任务执行器不协调
我正在阅读spring集成参考文档,在第10.1.8 Asynchronous Polling节中,有人写道,不协调的conf会导致内存泄漏
根据以下文件,配置不协调:
<int:channel id="publishChannel">
<int:queue />
</int:channel>
<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" />
我很难理解这一部分,因为它写了4个线程将每秒执行,因为每个线程将等待250毫秒,任务将以每秒20的速度添加
任务执行器不应该只分配一个线程来等待传入消息,并且应该启动最大线程数,以防队列中有足够的任务吗?还有,为什么每秒只执行4个线程?如果任务需要超过250毫秒怎么办
如果事情太简单,我遗漏了一些琐碎的东西,我会道歉
# 1 楼答案
<task:executor id="taskExecutor" pool-size="20" />
具有一个无界任务队列。这是默认值task-executor="taskExecutor" fixed-rate="50"
表示不阻塞调度程序的线程,调度程序每50毫秒启动一次新的轮询!它确实独立于publishChannel
内容而发生。我的意思是新任务总是放在taskExecutor
队列中如果下游进程真的足够长,那么执行器的所有
20
线程都会很忙,任务的内部队列也会增加。这就是内存泄漏的原因1秒/50毫秒=每秒20个任务
如果
publishChannel
中没有消息,我想说任务执行器中的所有线程都将忙于等待5秒超时。那么,任务的费率是多少20 active tasks / 5000 millis to wait for their finish = 4 per second
这个故事并不是关于4个线程,而是在值得的情况下,我们能够以多快的速度耗尽任务队列