【发布时间】:2016-01-01 21:20:35
【问题描述】:
我有大量运行的并行进程。似乎仅仅创建并行 scala Futures 就会造成内存泄漏。
下面的示例代码。根据你的机器设置 VM 标志,这样它就不会在启动时立即转储,以防你有很多内核,“-Xmx100m -XX:+HeapDumpOnOutOfMemoryError”。
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await
import scala.concurrent.duration._
object Bug extends App {
println("Memory leak")
while(true){
Future {
val data = new Array[Byte](1000000*1) // 1 MB
println(".")
}
}
}
几分钟后,此代码将显着变慢。堆转储分析显示数组 scala.concurrent.forkjoin.ForkJoinTask[] 似乎溢出了。
以下链接似乎相关,但并未真正提供任何解决该问题的方法:https://issues.scala-lang.org/browse/SI-7336
【问题讨论】:
-
你用的是什么版本的scala和java?
-
java 版本 "1.8.0_66" 和 Scala 代码运行器版本 2.11.7
-
起初我认为可能是
println阻塞了您的 Futures,最终会导致备份和随后的内存不足异常。但是如果没有 println,我仍然会看到您提到的相同结果。我不相信这证明存在泄漏。 如果 JVM 生成 Future 的速度比释放/重用内存的速度更快,则不会发生泄漏,但会导致相同的异常... -
@RamonJRomeroyVigil 产卵是一个很好的点。我将在等待的情况下运行更长的测试并报告结果。在我的应用程序中,我有一些线程将数据推送到数据库中,因此生成问题实际上可能是根本原因,因为它们的创建速度可能比数据库获取数据的速度要快。应该可以在几个小时内报告。
-
@RamonJRomeroyVigil 我想你发现了这个问题,它似乎与创作有关。在未来稍等片刻运行它可以解决问题,并且内存长期保持不变。谢谢!!!相关问题:stackoverflow.com/questions/30178378/…
标签: scala memory-leaks