我们有一个小型弹簧集成通道系统,它会在应用程序的高负载下引入内存泄漏。我们创建此示例应用程序仅用于测试弹簧聚合器。
SI Applicatiton Sample Git Project
在 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
关于内存泄漏情况时间将继续增加,当不在内存泄漏情况下,它将在数字周围变得稳定。
希望有人可以对此有所了解并表明我们在这里做错了什么? 谢谢