Я намагаюся зрозуміти, чому наведена нижче програма 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
.