【问题标题】:Poller Task Executor Memory LeakPoller 任务执行器内存泄漏
【发布时间】:2019-09-06 09:17:40
【问题描述】:

我正在构建一个企业应用程序,并且我正在使用活动 mq 进行应用程序之间的内部通信。当我将任务执行器与轮询器 AbstractPollingEndpoint 和 ErrorHandlingTaskExecutor 对象实例一起使用时,会导致内存泄漏。即使应用程序处于空闲模式,堆中的对象计数也会增加。当我关闭这部分代码时 .taskExecutor(outTaskExecutor) 问题不再发生。但是我们正在为繁忙的流量做准备,我们不需要提供更多的线程来处理消息。我究竟做错了什么?你能帮忙吗? 谢谢

Visual VM Heap Comparison

Executor Service outTaskExecutor = Executors.newFixedThreadPool(10);

IntegrationFlow jmsOutbound = IntegrationFlows.from(jmsInChannel)
                .handle(Jms.outboundAdapter(this.jmsTemplate.getConnectionFactory())
                                .destinationExpression("headers['responseQueueName']")
                        , s -> s.poller(p -> p.fixedDelay(pollerDelay).taskExecutor(outTaskExecutor)).get())
                .get();
        this.flowContext.registration(jmsOutbound).id("jmsOutbound").register();

【问题讨论】:

    标签: spring spring-integration dsl poller


    【解决方案1】:

    对于每个动态流都使用Executor Service outTaskExecutor = Executors.newFixedThreadPool(10); 看起来不太合适。为什么不将其作为单例并与您的所有动态流共享?

    还要注意文档中类似问题的描述:https://docs.spring.io/spring-integration/reference/html/#async-polling

    加上这个 SO 问题:Memory leak because of receive timeout and task executor out of tune conf

    【讨论】:

    • 我尝试将其设为单例,但内存泄漏仍在继续。
    • 嗯,这只是为了避免每次调用都使用new Executor 的额外线程。这些链接中描述了内存泄漏。不知道你为什么没有关注他们...
    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多