【发布时间】:2025-04-16 12:15:01
【问题描述】:
以下 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)。
我了解流会延迟评估,但会在生成元素后保留元素。但似乎在我上面的代码中,每个新流(由最后一行代码生成)以某种方式保留对先前流的引用。有人可以帮忙解释一下吗?
【问题讨论】:
-
它仍然使用
a = a.map(identity)泄漏内存,你确定它适合你吗? -
@TomaszNurkiewicz 你是对的。它仍然会随着身份线泄漏。感谢您的现场 - 我会更新问题。
标签: scala memory-management collections stream