我有一个运行的大规模并行进程集合。似乎仅仅创建Scala Futures 并发就会导致内存泄漏。
以下是示例代码。根据您的机器设置VM标志,以防万一您有许多核心,请使用"-Xmx100m -XX:+HeapDumpOnOutOfMemoryError"。
(Note: 本文中的“内存泄漏”指程序在不再需要内存时未能释放已分配内存空间的情况)
几分钟后,这段代码将会明显变慢。堆转储分析表明,数组scala.concurrent.forkjoin.ForkJoinTask[]似乎已经溢出。
下面的链接似乎与此相关,但并没有真正提供解决方案:https://issues.scala-lang.org/browse/SI-7336
以下是示例代码。根据您的机器设置VM标志,以防万一您有许多核心,请使用"-Xmx100m -XX:+HeapDumpOnOutOfMemoryError"。
(Note: 本文中的“内存泄漏”指程序在不再需要内存时未能释放已分配内存空间的情况)
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
println
阻塞了你的Futures,最终导致了堵塞和随后的内存溢出异常。但是即使没有println,我仍然看到了你提到的相同结果。我不确定这证明了是否存在泄漏。如果JVM在产生Futures方面比释放/重用内存更快,那么就不会有泄漏,但是会导致相同的异常... - Ramón J Romero y Vigil