即使有7G的堆空间,这也会耗尽内存。
import scala.collection.mutable.Set
class Foo() {
val anEmptySet: Set[Int] = Set()
def bar(ints: Traversable[Int]): Unit = {}
override def finalize() {
bar(anEmptySet)
super.finalize()
}
}
object FooTest {
def main(args: Array[String]): Unit = {
for (i <- 0 to 100000000) {
val f = new Foo()
}
}
}
导致问题的原因是什么,以及如何避免?问题似乎是在finalize方法中调用bar
,但我不明白为什么它会泄漏内存。我知道典型的类不需要覆盖finalize,但在此代码的真实版本中是必要的。
答案 0 :(得分:3)
正如我在评论中所说,这根本不是Scala特有的问题。 finalize
直接来自java.lang.Object
。 this answer很好地描述了这个问题,但我会毫不犹豫地说这个问题完全重复。
它的要点是finalize
需要通过某种东西来调用。但是当你快速连续创建1000亿个对象时,它们的创建速度要快于最终确定的速度。该线程需要可以调用finalize
,但这不是因为它太忙于创建更多对象。
你怎么解决?您可以从不快速连续创建同一对象的1000亿个实例开始。我知道这只是一个玩具示例,但在现实世界中,你必须尽量避免同时分配太多这些。鉴于这不是实际的代码,提供更好的建议更难。