Estoy tratando de entender por qué el siguiente programa Java da un OutOfMemoryError
, mientras que el programa correspondiente sin .parallel()
no.
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()
);
Tengo dos preguntas:
¿Cuál es el resultado previsto de este programa?
Sin
.parallel()
que parezca que esto simplementesum(1+2+3+...)
sale, lo que significa que simplemente "se atasca" en la primera secuencia en el plano, lo cual tiene sentido.Con el paralelo, no sé si hay un comportamiento esperado, pero supongo que de alguna manera intercaló los primeros
n
flujos, donden
está el número de trabajadores paralelos. También podría ser ligeramente diferente en función del comportamiento de fragmentación / almacenamiento en búfer.¿Qué hace que se quede sin memoria? Estoy tratando específicamente de entender cómo se implementan estas transmisiones bajo el capó.
Supongo que algo bloquea el flujo, por lo que nunca termina y puede deshacerse de los valores generados, pero no sé exactamente en qué orden se evalúan las cosas y dónde se produce el almacenamiento en búfer.
Editar: en caso de que sea relevante, estoy usando Java 11.
Editt 2: Aparentemente, sucede lo mismo incluso para el programa simple IntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()
, por lo que podría tener que ver con la pereza de limit
más que con flatMap
.