J'essaie de comprendre pourquoi le programme Java suivant donne un OutOfMemoryError
, tandis que le programme correspondant sans .parallel()
n'en donne pas.
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()
);
J'ai deux questions:
Quelle est la sortie prévue de ce programme?
Sans
.parallel()
cela, cela semble simplementsum(1+2+3+...)
sortir, ce qui signifie qu'il "reste bloqué" au premier flux du flatMap, ce qui est logique.Avec le parallèle, je ne sais pas s'il y a un comportement attendu, mais je suppose qu'il entrelacerait en quelque sorte le premier
n
ou les deux flux, oùn
est le nombre de travailleurs parallèles. Il peut également être légèrement différent en fonction du comportement de segmentation / mise en mémoire tampon.Qu'est-ce qui fait qu'il manque de mémoire? J'essaie spécifiquement de comprendre comment ces flux sont mis en œuvre sous le capot.
Je suppose que quelque chose bloque le flux, donc il ne se termine jamais et est capable de se débarrasser des valeurs générées, mais je ne sais pas exactement dans quel ordre les choses sont évaluées et où la mise en mémoire tampon se produit.
Edit: Au cas où cela serait pertinent, j'utilise Java 11.
Editt 2: Apparemment, la même chose se produit même pour le programme simple IntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()
, donc cela pourrait avoir à voir avec la paresse limit
plutôt que flatMap
.