0

我有两个通过 akka 远程通信的演员系统。

当我查看 JVM 堆时,我看到(太多)akka.dispatch.Envelope包含SelectChildName来自akka.remote.RemoteActorRefProvider$RemoteDeadLetterActorRef.

这些消息的保留堆非常大,会导致内存问题。

SelectChildName这些消息的目的是什么?有没有办法避免它们?

仅供参考,这似乎与两个参与者系统之间发生的解除关联错误有关。

谢谢,迈克尔

4

1 回答 1

1

SelectChildNameAkka Remoting 使用消息来解析远程参与者。如果您看到很多,那么您有可能直接与一个 交互ActorSelection,而不是一个ActorRef

例如,每次您向 发送消息时ActorSelection(这些取自docs

val selection = context.actorSelection("akka.tcp://actorSystemName@10.0.0.1:2552/user/actorName")
selection ! "Pretty awesome feature"

解决了 - 可能是远程的 - 演员,这涉及到SelectChildName底层 Akka 基础设施的消息交换。

如果是这种情况,请尝试直接使用ActorRefs. 您可以ActorSelection使用该resolveOne方法从 an 中获取一个。

再次引用文档

总是最好使用它们的 ActorRef 与其他 Actor 进行通信,而不是依赖于 ActorSelection。例外是

  • 使用至少一次传递工具发送消息
  • 开始与远程系统的第一次联系
于 2017-04-25T13:18:21.913 回答