我试图理解为什么以下Java程序给出OutOfMemoryError
,而没有的相应程序没有给出.parallel()
。
System.out.println(Stream
.iterate(1, i -> i+1)
.parallel()
.flatMap(n -> Stream.iterate(n, i -> i+n))
.mapToInt(Integer::intValue)
.limit(100_000_000)
.sum()
);
我有两个问题:
该程序的预期输出是什么?
如果没有,
.parallel()
这似乎只是输出sum(1+2+3+...)
,这意味着它只是在flatMap的第一个流“卡住”了,这是有道理的。对于并行,我不知道是否有预期的行为,但是我的猜测是它以某种方式交错了第一个
n
左右的流,n
并行工作者的数量在哪里。根据组块/缓冲行为,它也可能略有不同。是什么导致它的内存不足?我正在专门尝试了解这些流是如何在后台实现的。
我猜有些东西阻塞了流,因此它永远不会完成,并且能够摆脱生成的值,但是我不太清楚事物的评估顺序和缓冲发生的位置。
编辑:如果相关,我正在使用Java 11。
Editt 2:即使对于简单的程序IntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()
,显然也会发生同样的事情,因此它可能与limit
而不是的懒惰有关flatMap
。