Spring Integration聚合器内存泄漏

时间:2016-01-28 15:20:21

标签: spring memory-leaks spring-integration

我们有一个小型弹簧集成通道系统,它会在应用程序的高负载下引入内存泄漏。我们创建此示例应用程序仅用于测试弹簧聚合器。

SI Applicatiton Sample Git Project

Heap Dumps on both scenarios

Messenger 类中,我们控制提交线程在明星提交下一个1000之前传递给某个频道的1000条消息后休眠的时间。

    public void run() {
    int correlationId = 0;
    while (true) {

        for (int sequenceNumber = 0; sequenceNumber < sequenceSize; sequenceNumber++) {
            Job jp = new Job(name);
            Message<Job> message2 = MessageBuilder.withPayload(jp)
           .setSequenceNumber(sequenceNumber)
           .setSequenceSize(sequenceSize)
           .setCorrelationId(correlationId).build();

           channel.send(message2);
        }

        try {
            Thread.sleep(100, 0);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        correlationId++;
        if (correlationId >= CORRELATION_ID_MAX) {
            correlationId = 0;
        }
    }

我们认为在正常操作中不占用内存 TreeMap $ Entry 会占用大量实例的堆内存,但是将睡眠时间减少到非常低的量 HashMap $ Node 开始成为一个问题

低负载时没有内存泄漏 When low load no memory leak

高负载内存泄漏时 When high load memory leak

HashMap $ Node 将永远增加其内存利用率。

我们正在从聚合器收到聚合消息列表后,从 messageOutChannel 频道打印终端上的列表项延迟。

Time :   647 ms  List size : 1000   Hash : 875023460    By thread : th0  -FP

关于内存泄漏情况时间将继续增加,当不在内存泄漏情况下,它将在数字周围变得稳定。

希望有人可以对此有所了解并表明我们在这里做错了什么? 谢谢

1 个答案:

答案 0 :(得分:1)

这与聚合器无关;内存“泄漏”只是因为你在任务执行器中排队了很多任务,你的队列大小没有限制。

enter image description here