并行无限 Java 流耗尽内存
我试图理解为什么下面的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()
);
我有两个问题:
-
该程序的预期输出是什么?
如果没有,这似乎只是简单地输出,这意味着它只是“卡住”在flatMap中的第一个流,这是有道理的。
.parallel()
sum(1+2+3+...)
对于并行,我不知道是否存在预期的行为,但我的猜测是,它以某种方式交错了第一个左右的流,并行工作者的数量在哪里。根据分块/缓冲行为,它也可能略有不同。
n
n
-
是什么原因导致内存不足?我特别试图了解这些流是如何在引擎盖下实现的。
我猜有些东西阻塞了流,所以它永远不会完成,并且能够摆脱生成的值,但我不太清楚事情的评估顺序以及缓冲发生的位置。
编辑:如果相关,我正在使用Java 11。
编辑 2:显然,即使对于简单的程序,也会发生同样的事情,因此它可能与懒惰有关,而不是。IntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()
limit
flatMap