Estou tentando entender por que o seguinte programa Java fornece um OutOfMemoryError, enquanto o programa correspondente sem .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()
);
Eu tenho duas perguntas:
Qual é o resultado pretendido deste programa?
Sem
.parallel()parece que isso simplesmente gera, osum(1+2+3+...)que significa que simplesmente "fica preso" no primeiro fluxo no flatMap, o que faz sentido.Com o paralelo, não sei se há um comportamento esperado, mas meu palpite seria que, de alguma forma, intercalou os primeiros
nou mais fluxos, ondenestá o número de trabalhadores paralelos. Também pode ser um pouco diferente com base no comportamento de fragmentação / buffer.O que faz com que fique sem memória? Estou tentando entender especificamente como esses fluxos são implementados sob o capô.
Suponho que algo bloqueie o fluxo, para que ele nunca termine e possa se livrar dos valores gerados, mas não sei em que ordem as coisas são avaliadas e onde ocorre o buffer.
Editar: Caso seja relevante, estou usando o Java 11.
Editt 2: Aparentemente, a mesma coisa acontece até para o programa simples IntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum(), por isso pode ter a ver com a preguiça de, em limitvez de flatMap.