我有大量運行的並行進程。似乎僅僅創建平行scala期貨會造成內存泄漏。如何防止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'擋住你的期貨最終將導致備份和隨後的內存不足的異常。但是如果沒有println,我仍然可以看到你提到的結果。我不相信這證明有泄漏。 **如果**的JVM是在產卵期貨比釋放/重複使用的內存不會有泄漏,但相同的異常會導致更快... –