【问题标题】:What is the cause of this strange Scala memory leak? [duplicate]这种奇怪的 Scala 内存泄漏的原因是什么? [复制]
【发布时间】:2015-05-11 22:03:14
【问题描述】:

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

【问题讨论】:

  • Java 中也会发生这种情况:stackoverflow.com/a/8355147/2292812 你使终结器比后台线程调用它们的速度更快,因此它们堆积起来,不会被 GC 处理。
  • 这是一个很好的例子。感谢分享。

标签: scala memory-leaks


【解决方案1】:

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

它的要点是finalize 需要被某些东西调用。但是,当您快速连续地创建 1000 亿个对象时,它们的创建速度要比最终确定的快得多。线程需要可以调用finalize,但这并不是因为它忙于创建更多对象。

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

【讨论】:

    猜你喜欢
    • 2020-04-17
    • 2011-08-11
    • 2019-10-19
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多