다음 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
.