Stream上的Strange OutOfMemoryError

时间:2010-09-02 15:32:03

标签: scala

为什么我会为以下代码获取OutOfMemoryError?

Stream.from(1).filter(n =>(1到20).forall(x =&n; n%x == 0))。head

2 个答案:

答案 0 :(得分:6)

Streams对JVM有一些限制。你在这里看到的问题是你用Stream.from(1)创建的Stream被放在堆栈上,因此JVM拒绝垃圾收集它。您传递给filter调用的谓词可让Stream增长到232792560元素。

如果您使用Iterator,则可以解决此限制:

Iterator.from(1).filter(n => (1 to 20).forall(x => n % x == 0)).next

答案 1 :(得分:3)

对Streams进行了延迟评估,但他们存储了评估结果。因此,除非您想多次遍历它们,否则应使用Iterator代替。

相关问题