【问题标题】:How to recover (garbage collect) memory allocated in scala repl?如何恢复(垃圾收集)在 scala repl 中分配的内存?
【发布时间】:2012-08-29 17:47:20
【问题描述】:

我有一个带有大型不可变对象的程序,该对象在执行特定操作时返回其自身的修改版本。我尝试在 sbt 控制台中对其进行测试,例如 var myObj = getInitialObject();然后反复调用 myObj = myObj.getNewOne();

没有对旧对象的引用,但内存似乎没有被释放。最终我得到一个 OutOfMemoryError: GC 开销限制超出。我能够在 scala repl 提示符下通过一个简单的示例重现该问题:

scala> val foo = List.fill(1000000) { new Object() } foo: List[java.lang.Object] = List(java.lang.Object@14fd510, java.lang.Object@202d0e1c, java.lang.Object@6df960c4, java.lang.Object@f401c44, java.lang.Object @39ffbc2e,java.lang.Object@449b8dc1,java.lang.Object@40779d17,java.lang.Object@6cea7211,java.lang.Object@13e6f1f4,java.lang.Object@1f16d461,java.lang.Object@13d13c39 , java.lang.Object@dc8cc59, java.lang.Object@79dfee20, java.lang.Object@5c8ab562, java.lang.Object@168a6465, java.lang.Object@57c52e72, java.lang.Object@526c6b62, java .lang.Object@4bfe1934, java.lang.Object@1728cbe6, java.lang.Object@776274ea, java.lang.Object@60e9ebe1, java.lang.Object@1d7d327c, java.lang.Object@67d7a04, java.lang .Object@17d59ff0, java.lang.Object@49f751c9, java.lang.Object@c1a890f, java.lang.Object@221c3dfe, java.lang.Object@6c2a0030, java.lang.O... scala> val foo = List.fill(1000000) { new Object() } foo: List[java.lang.Object] = List(java.lang.Object@6e8fb561, java.lang.Object@1ccd2bfc, java.lang.Object@6202bc29,.... (省略其余输出) scala> val foo = List.fill(1000000) { new Object() } ....再重复几次,得到: scala> val foo = List.fill(1000000) { new Object() } 空值 java.lang.OutOfMemoryError:超出 GC 开销限制 在 scala.tools.nsc.transform.SpecializeTypes$$anonfun$13.apply(SpecializeTypes.scala:669) 在 scala.tools.nsc.transform.SpecializeTypes$$anonfun$13.apply(SpecializeTypes.scala:667) 在 scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:200) 在 scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:200) 在 scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59) 在 scala.collection.immutable.List.foreach(List.scala:45) 在 scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:200) 在 scala.collection.immutable.List.flatMap(List.scala:45) 在 scala.tools.nsc.transform.SpecializeTypes.specializeClass(SpecializeTypes.scala:667) 在 scala.tools.nsc.transform.SpecializeTypes.transformInfo(SpecializeTypes.scala:1065) 在 scala.tools.nsc.transform.InfoTransform$Phase$$anon$1.transform(InfoTransform.scala:38) ...... ……

每次都使用“var”而不用重新声明来代替 val 似乎没有帮助。如何让 repl/sbt 为不再相关的对象引用释放/垃圾收集内存?

【问题讨论】:

  • 你总是从解释器运行这个吗?我猜想解释器本身持有一个参考。命令行 scala 解释器保存这些,因此您可以反向引用它们。在一个真正的编译程序中尝试它,你确定你会放弃它。
  • 是的,我正在从解释器中运行它。关键是我希望能够从解释器测试我的应用程序,但不会耗尽内存......这样测试更容易。

标签: scala memory garbage-collection read-eval-print-loop


【解决方案1】:

到目前为止,你还不能。 https://issues.scala-lang.org/browse/SI-4331

【讨论】:

    猜你喜欢
    • 2021-06-27
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多