如何解决Akka actor 内存泄漏使用 Akka Http
我正在使用带有 Scala 的 Akka-http。我有一个 MainApp 类,它在启动时初始化并有一个 ActorRef。
abstract class MainApp{
def actorSystem: ActorSystem
def myService: ActorRef
def stop(): Unit = {
actorSystem.terminate()
}
}
object MyMain {
def main(args: Array[String]): Unit = {
implicit val system = ActorSystem("my-actor-system")
implicit val executionContext: ExecutionContextExecutor = system.dispatcher
val app = new MainApp {
override def actorSystem: ActorSystem = system
val dbPool: MyDbManagement = new MyDbManagement(someConfig)
override def preProcessorService: ActorRef =
actorSystem.actorOf(
Props(new MyService(actorSystem,dbPool))
.withDispatcher("processing-dispatcher")
)
}
val httpBindingFuture = Http().newServerAt("0.0.0.0",httpPort).bind(app.http.route)
....//start server and add shutDown hooks
actor 类收到一条消息,如下所示
class MyService(actorSystem,dbPool){
override def receive: Receive = {
case SendMessage(request) => {
val actorSender = sender()
implicit val executionContext = actorSystem.dispatchers.lookup("db-blocking-dispatcher")
try {
val encryptedReq = dbPool.encrypt(request)
val responseFuture = dbPool.sendToDb(request)
responseFuture.onComplete { //handle error codes and return something like
actorSender ! MyResponse(202,"Accepted")
}
}
}
我有一个 http 路由,它询问消息
path("send") {
post {
entity(as[MyPojo]) { request =>
onSuccess(app.MyService ? SendMessage(request)) {
case response: MyResponse => {
complete(response.statusCode,response)
}
}
}
}
}
问题陈述:我在应用程序中只创建了 1 个参与者,但有多个调度程序(fork-join-executor)执行多项任务并释放默认调度程序,以便它可以接受非阻塞传入请求。传入请求的数量非常高。 此应用程序存在内存泄漏并随着时间的推移而降级(堆大小增加并发生完全 GC,这需要时间和 CPU) 当它处于降级状态时,我进行了堆转储。 在对 MAT 工具的调查中, 主要泄漏嫌疑人是LocalActorRef
一个由“jdk.internal.loader.ClassLoaders$AppClassLoader @ 0x609c0ee58”加载的“akka.actor.LocalActorRef”实例占用约7GB(95.80%)字节。
Class Name | Shallow Heap | Retained Heap
akka.actor.LocalActorRef| 24 | ~ 7 GB
我想知道是什么导致了这种内存泄漏?
如果有更多与设计相关的问题或建议,请告诉我。
我已经完成了以下操作,但没有任何帮助: https://discuss.lightbend.com/t/localactorref-memory-leak-and-full-gc-allocation-failure-causing-gc-to-take-too-long/7216/6
Akka Actor Memory Leak or Management
我也考虑过使用 Futures,但使用 Futures 应用程序具有更高的延迟
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。