[英]Spring Integration aggregator memory leak
我们有一个小型的弹簧集成通道系统,它会在应用程序高负载时引入内存泄漏。 我们创建此示例应用程序只是为了测试弹簧聚合器。
在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.