Próbuję zrozumieć, dlaczego następujący program Java daje OutOfMemoryError
, a odpowiedni program bez .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()
);
Mam dwa pytania:
Jakie jest zamierzone wyjście tego programu?
Bez
.parallel()
tego wydaje się, że to po prostu wyprowadza,sum(1+2+3+...)
co oznacza, że po prostu „zacina się” przy pierwszym strumieniu w flatMapie, co ma sens.Równolegle nie wiem, czy zachodzi oczekiwane zachowanie, ale domyślam się, że w jakiś sposób przeplata on pierwsze
n
strumienie, gdzien
jest liczba równoległych pracowników. Może również nieznacznie różnić się w zależności od zachowania polegającego na dzieleniu / buforowaniu.Co powoduje brak pamięci? W szczególności staram się zrozumieć, w jaki sposób te strumienie są wdrażane pod maską.
Zgaduję, że coś blokuje strumień, więc nigdy się nie kończy i jest w stanie pozbyć się wygenerowanych wartości, ale nie bardzo wiem, w jakiej kolejności rzeczy są oceniane i gdzie zachodzi buforowanie.
Edycja: Jeśli jest to istotne, używam Java 11.
Editt 2: Najwyraźniej to samo dzieje się nawet w przypadku prostego programu IntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()
, więc może to mieć związek z lenistwem limit
zamiast flatMap
.