我们有一个小型的弹簧集成通道系统,它在应用程序的高负载上引入了内存泄漏。我们创建这个示例应用程序仅仅是为了测试spring聚合器。
在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
在内存泄漏情况下,时间将不断增加,当不处于内存泄漏情况时,它将在一个数字附近变得稳定。
希望有人能对此有所了解,并表明我们在这里做错了什么?谢谢
发布于 2016-02-01 14:50:17
这与聚合器无关;内存“泄漏”仅仅是因为您在任务执行器中排队处理大量任务,并且对其队列大小没有限制。
https://stackoverflow.com/questions/35065313
复制相似问题