这个奇怪的Scala内存泄漏的原因是什么?

时间:2015-05-11 22:03:15

标签: scala memory-leaks

即使有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,但在此代码的真实版本中是必要的。

1 个答案:

答案 0 :(得分:3)

正如我在评论中所说,这根本不是Scala特有的问题。 finalize直接来自java.lang.Objectthis answer很好地描述了这个问题,但我会毫不犹豫地说这个问题完全重复。

它的要点是finalize需要通过某种东西来调用。但是当你快速连续创建1000亿个对象时,它们的创建速度要快于最终确定的速度。该线程需要可以调用finalize,但这不是因为它太忙于创建更多对象。

你怎么解决?您可以从不快速连续创建同一对象的1000亿个实例开始。我知道这只是一个玩具示例,但在现实世界中,你必须尽量避免同时分配太多这些。鉴于这不是实际的代码,提供更好的建议更难。