以下 Scala 代码(在 2.9.2 上):
var a = ( 0 until 100000 ).toStream
for ( i <- 0 until 100000 )
{
val memTot = Runtime.getRuntime().totalMemory().toDouble / ( 1024.0 * 1024.0 )
println( i, a.size, memTot )
a = a.map(identity)
}
在循环的每次迭代中使用越来越多的内存。如果a
定义为( 0 until 100000 ).toList
,那么内存使用是稳定的(give or take GC)。
我知道流会懒惰地评估,但一旦生成就会保留元素。但似乎在我上面的代码中,每个新流(由最后一行代码生成)以某种方式保留对先前流的引用。有人可以帮忙解释一下吗?