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
n
ou mais fluxos, onden
está 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 limit
vez de flatMap
.