【问题标题】:Akka Actor Memory Leak or ManagementAkka Actor 内存泄漏或管理
【发布时间】:2024-04-14 14:15:02
【问题描述】:

您对 akka actor 内存管理/泄漏有任何经验吗?在这里,我有一个模块使用 akka actor 与其他模块通信,但随着时间的推移,其中一个模块因堆内存大小而关闭。

毒丸结束后需要给小演员送吗?因为每一个请求,我都想做另一个演员,每一个请求。如果他们也有自己的儿童演员,是否需要在儿童演员中再次发送毒丸?

ps:我正在使用 Scala Akka

谢谢

【问题讨论】:

    标签: scala memory-management memory-leaks out-of-memory akka


    【解决方案1】:

    是的,您创建的每个 Actor 都需要明确停止。这通常通过从 Actor 内部调用 context.stop(self) 来完成(如果它可以确定它已完成其任务)或让主管使用 context.stop(child) 停止它。

    【讨论】:

    • 使用 PoisonPill 怎么样?它会阻止它的孩子,以及它的孩子的孩子吗?还是应该在每次实例化时发送 PoisonPill?
    • Actor 终止总是递归的,无论它如何开始。
    【解决方案2】:

    为了防止内存不足,您可以在接收参与者上使用有界消息队列,即邮箱:http://doc.akka.io/docs/akka/snapshot/scala/mailboxes.html

    要选择管理子actor的方式(重启、杀死等),请使用主管策略: http://doc.akka.io/docs/akka/snapshot/general/supervision.html。可以在任何级别/父级选择主管策略。

    【讨论】: