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