And*_*idy 2 memory-leaks scala out-of-memory actor akka
我有一个相当基本的包装类围绕scala akka actorRef.基本上该类有一个作为actorRef的字段,并公开了许多将"告诉"特定消息给actorRef的方法.以这种方式,我可以遵循指定API并避免暴露tell或消息类.我在我的程序中遇到了内存泄漏,我想知道我的akka actor周围的包装是否导致问题.我在下面写了这个模拟来测试我的理论.
import akka.actor.{ActorSystem, ActorRef, PoisonPill}
import akka.actor.ActorDSL._
implicit val as = ActorSystem()
def createMemoryActor(): ActorRef = actor(new Act {
Array.fill(99999999)(1.0) // Just to take up memory
become {
case _ => print("testing memory leaks")
}
})
val memoryActor = createMemoryActor() // memory usage jumps up
memoryActor ! PoisonPill
System.gc() // memory usage goes back down
case class ActorWrapper() {
val memoryActor = createMemoryActor()
}
def doNothing(): Unit = {
val shouldGetGCed = ActorWrapper()
()
}
doNothing() // memory usage jumps up
System.gc() // memory usage goes back down
Run Code Online (Sandbox Code Playgroud)
我在scala repl中运行上面的代码并运行jvisualvm来分析内存使用情况.似乎"shouldGetGCed"引用收集了车库,其actorRef字段(占用内存)也被垃圾收集.总是这样,还是我错过了什么?任何人都有任何最佳实践来包装演员以遵守特定的API?
已启动每一个演员最终必须停止,直到发生这种情况它会消耗内存.在你的例子中,你需要例如shouldGetGCed.memoryActor ! PoisonPill.有没有自动垃圾收集行为,因为它们是由自然分布的实体和JVM不支持分布式GC.