繁体   English   中英

Spring Integration聚合器内存泄漏

[英]Spring Integration aggregator memory leak

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

SI应用样本Git项目

两种情况下的堆转储

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就会成为一个问题

低负载时无内存泄漏 低负载时无内存泄漏

高负载内存泄漏时 高负载内存泄漏时

HashMap $ Node将永远永远提高其内存利用率。

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

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

在内存泄漏情况下, 时间将持续增加,而在没有内存泄漏情况下,它将稳定在一个数字附近。

希望有人能对此有所启发,并证明我们在这里做错了什么? 谢谢

这与聚合器无关。 内存“泄漏”仅是因为您正在任务执行程序中排队处理成千上万个任务,并且对其队列大小没有限制。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM