Tôi đang cố gắng để hiểu tại sao chương trình Java sau cung cấp một OutOfMemoryError
, trong khi chương trình tương ứng mà không .parallel()
có.
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()
);
Tôi có hai câu hỏi:
Đầu ra dự định của chương trình này là gì?
Không có
.parallel()
vẻ như điều này chỉ đơn giản là đầu rasum(1+2+3+...)
có nghĩa là nó chỉ đơn giản là "bị kẹt" ở luồng đầu tiên trong FlatMap, điều này có ý nghĩa.Song song tôi không biết liệu có một hành vi dự kiến hay không, nhưng tôi đoán là bằng cách nào đó đã xen kẽ các
n
luồng đầu tiên hoặc lâu hơn, trong đón
số lượng công nhân song song. Nó cũng có thể hơi khác nhau dựa trên hành vi chunking / đệm.Điều gì gây ra nó hết bộ nhớ? Tôi đặc biệt đang cố gắng hiểu làm thế nào các luồng này được thực hiện dưới mui xe.
Tôi đoán thứ gì đó chặn luồng, vì vậy nó không bao giờ kết thúc và có thể loại bỏ các giá trị được tạo, nhưng tôi không biết thứ tự nào được đánh giá và nơi đệm xảy ra.
Chỉnh sửa: Trong trường hợp có liên quan, tôi đang sử dụng Java 11.
Editt 2: Rõ ràng điều tương tự xảy ra ngay cả đối với chương trình đơn giản IntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()
, vì vậy nó có thể phải làm với sự lười biếng limit
hơn là flatMap
.