Sto cercando di capire perché il seguente programma Java dà un OutOfMemoryError
, mentre il programma corrispondente senza .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()
);
Ho due domande:
Qual è l'output previsto di questo programma?
Senza
.parallel()
sembra che questo semplicementesum(1+2+3+...)
emetta, il che significa che si "blocca" semplicemente al primo flusso nella flatMap, il che ha senso.Con parallelamente non so se ci sia un comportamento previsto, ma la mia ipotesi sarebbe che in qualche modo intercalasse i primi
n
flussi, dove sin
trova il numero di operatori paralleli. Potrebbe anche essere leggermente diverso in base al comportamento di chunking / buffering.Cosa causa l'esaurimento della memoria? Sto specificamente cercando di capire come questi flussi sono implementati sotto il cofano.
Immagino che qualcosa blocchi lo stream, quindi non finisce mai ed è in grado di sbarazzarsi dei valori generati, ma non so bene in quale ordine vengono valutate le cose e dove si verifica il buffering.
Modifica: nel caso sia rilevante, sto usando Java 11.
Editt 2: Apparentemente la stessa cosa accade anche per il semplice programma IntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()
, quindi potrebbe avere a che fare con la pigrizia limit
piuttosto che flatMap
.