Я пытаюсь понять, почему следующая 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
.