Spring MongoDB流的内存泄漏?

时间:2019-06-13 13:45:12

标签: java spring java-stream spring-mongodb

以下代码可能导致内存泄漏:

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代码在某处保存了引用吗?

Memory footprint

更新和修复:

显然,我在这里混入了括号,必须按以下顺序排列:

    StreamUtils.createStreamFromIterator(
        mongoTemplate.stream(
            createQuery(reregisterDTO),
            Shipment.class
        )
    ).forEach(shipment -> this.reregisterShipment(shipment, count));

以下是对袁庆飞的回答的信。

1 个答案:

答案 0 :(得分:1)

似乎您需要通过StreamUtils.createStreamFromIterator(Iterator<T>)创建流,而不是直接使用stream

请参阅Java 8 stream support in MongoTemplate