Я пытаюсь понять, почему следующая Java-программа дает OutOfMemoryError, а соответствующая .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()
);
У меня есть два вопроса:
Каков предполагаемый результат этой программы?
Без
.parallel()этого кажется, что это просто вывод,sum(1+2+3+...)что означает, что он просто «застревает» в первом потоке в flatMap, что имеет смысл.С параллельным я не знаю, есть ли ожидаемое поведение, но я предполагаю, что оно каким-то образом чередовало первые
nили около того потоков, гдеnчисло параллельных рабочих. Это также может немного отличаться в зависимости от поведения фрагментирования / буферизации.Что заставляет его исчерпать память? Я специально пытаюсь понять, как эти потоки реализованы под капотом.
Я предполагаю, что что-то блокирует поток, поэтому он никогда не завершается и не может избавиться от сгенерированных значений, но я не совсем знаю, в каком порядке оцениваются вещи и где происходит буферизация.
Изменить: В случае, если это актуально, я использую Java 11.
Editt 2: Очевидно, то же самое происходит даже для простой программы IntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum(), так что это может быть связано с ленивостью, limitа не flatMap.