Spring MongoDB 流内存泄漏?
Memory leak with Spring MongoDB stream?
下面的代码可能会导致内存泄漏:
public int reregister(ReregisterDTO reregisterDTO) {
AtomicInteger count = new AtomicInteger(0);
StreamUtils.createStreamFromIterator(
mongoTemplate
.stream(createQuery(reregisterDTO), Shipment.class))
.forEach(shipment -> this.reregisterShipment(shipment, count)
);
return count.get();
}
它已从数据库中提取了 20000 个实体,但似乎没有释放内存。
使用更大容量的 JVM 运行 完全内存不足。
如何释放内存并避免它?可能是底层 srping-mongodb 代码在某处持有引用?
更新和修复:
显然我在这里混淆了括号,必须按以下顺序:
StreamUtils.createStreamFromIterator(
mongoTemplate.stream(
createQuery(reregisterDTO),
Shipment.class
)
).forEach(shipment -> this.reregisterShipment(shipment, count));
感谢袁庆飞在下方的回答。
看来您需要通过 StreamUtils.createStreamFromIterator(Iterator<T>)
创建流,而不是直接使用 stream
。
请参考
下面的代码可能会导致内存泄漏:
public int reregister(ReregisterDTO reregisterDTO) {
AtomicInteger count = new AtomicInteger(0);
StreamUtils.createStreamFromIterator(
mongoTemplate
.stream(createQuery(reregisterDTO), Shipment.class))
.forEach(shipment -> this.reregisterShipment(shipment, count)
);
return count.get();
}
它已从数据库中提取了 20000 个实体,但似乎没有释放内存。 使用更大容量的 JVM 运行 完全内存不足。 如何释放内存并避免它?可能是底层 srping-mongodb 代码在某处持有引用?
更新和修复:
显然我在这里混淆了括号,必须按以下顺序:
StreamUtils.createStreamFromIterator(
mongoTemplate.stream(
createQuery(reregisterDTO),
Shipment.class
)
).forEach(shipment -> this.reregisterShipment(shipment, count));
感谢袁庆飞在下方的回答。
看来您需要通过 StreamUtils.createStreamFromIterator(Iterator<T>)
创建流,而不是直接使用 stream
。
请参考