下面的Scala代碼(在2.9.2):意外的Scala集合記憶行爲
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
,那麼內存使用率是穩定的(給出或接受GC)。
據我所知,溪流懶惰地評估,但一旦它們被生成就保留元素。但似乎在上面的代碼中,每個新的流(由最後一行代碼生成)以某種方式保持對之前流的引用。有人可以幫忙解釋嗎?
它仍然用'a = a.map(identity)'泄漏內存,你確定它適合你嗎? – 2013-02-15 15:25:17
@TomaszNurkiewicz你說得對。它仍然與身份線一起泄漏。謝謝你的提問 - 我會更新這個問題。 – 2013-02-15 15:33:50