Ich versuche zu verstehen, warum das folgende Java-Programm ein gibt OutOfMemoryError
, während das entsprechende Programm ohne .parallel()
dies nicht tut.
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()
);
Ich habe zwei Fragen:
Was ist die beabsichtigte Ausgabe dieses Programms?
Ohne
.parallel()
es scheint, dass dies einfachsum(1+2+3+...)
ausgegeben wird, was bedeutet, dass es einfach beim ersten Stream in der flatMap "hängen bleibt", was Sinn macht.Bei Parallel weiß ich nicht, ob es ein erwartetes Verhalten gibt, aber ich vermute, dass es irgendwie die ersten
n
oder so Streams verschachtelt hat , won
ist die Anzahl der Parallelarbeiter. Es kann auch etwas anders sein, basierend auf dem Chunking / Puffering-Verhalten.Was führt dazu, dass der Speicher knapp wird? Ich versuche speziell zu verstehen, wie diese Streams unter der Haube implementiert werden.
Ich vermute, dass etwas den Stream blockiert, so dass er nie beendet wird und die generierten Werte entfernen kann, aber ich weiß nicht genau, in welcher Reihenfolge die Dinge ausgewertet werden und wo Pufferung auftritt.
Bearbeiten: Falls es relevant ist, verwende ich Java 11.
Editt 2: Anscheinend passiert das Gleiche auch für das einfache Programm IntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()
, also hat es möglicherweise eher mit der Faulheit von limit
als mit zu tun flatMap
.