scala - 如何恢复(垃圾收集)在 scala repl 中分配的内存?

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

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

没有对旧对象的引用,但内存似乎没有被释放。最终我得到一个 OutOfMemoryError: GC overhead limit exceeded。我能够在 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,.... (ommiting the rest of the output)
scala> val foo = List.fill(1000000) { new Object() }
.... repeat a few more times and get:

scala> val foo = List.fill(1000000) { new Object() }
null

java.lang.OutOfMemoryError: GC overhead limit exceeded
    at scala.tools.nsc.transform.SpecializeTypes$$anonfun$13.apply(SpecializeTypes.scala:669)
    at scala.tools.nsc.transform.SpecializeTypes$$anonfun$13.apply(SpecializeTypes.scala:667)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:200)
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:200)
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
    at scala.collection.immutable.List.foreach(List.scala:45)
    at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:200)
    at scala.collection.immutable.List.flatMap(List.scala:45)
    at scala.tools.nsc.transform.SpecializeTypes.specializeClass(SpecializeTypes.scala:667)
    at scala.tools.nsc.transform.SpecializeTypes.transformInfo(SpecializeTypes.scala:1065)
    at scala.tools.nsc.transform.InfoTransform$Phase$$anon$1.transform(InfoTransform.scala:38)
.....
....

每次都使用没有重新声明的“var”而不是 val 似乎没有帮助。我怎样才能让 repl/sbt 释放/垃圾收集那个不再相关的对象引用的内存?

最佳答案

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

关于scala - 如何恢复(垃圾收集)在 scala repl 中分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12274124/

相关文章:

java - 垃圾收集的哪一部分需要 Sys 时间?

scala - 使用scala-submit从scala二进制文件开始跟踪和记录/调试 yarn 的贴合

scala - Shapeless 的类型不等式有问题吗?

c - lab_get_obj()中的slab_bufclt()是什么意思?

c++ - Win32 C++ 中的 DrawText 内存使用量增加

python - 删除/重新分配 python 列表是否允许垃圾回收?

scala - 将通用追加函数迁移到 Scala 2.13 集合

scala - sbt:我可以将scala编译器插件的源代码放入需要使用该插件编译的项目中吗?

python - 元组内存分配和普通变量内存分配的区别

java - 使用 simpleframework 时 Android 模拟器中的垃圾回收过多 (GC_FOR_MALLOC)