我有非常简单的应用程序(2个actor)通过套接字发送文件。应用程序使用Spring Boot和Akka,传输完成后,没有其他任何事情发生。但是,我注意到即使在传输之后CPU使用率也很高(例如4核心机器上的50%,所以完全2核心)。我捕获了活动线程的快照,其中约1/3属于Akka。
Akka在做什么,为什么需要这么多cpu?
答案 0 :(得分:1)
通常回答你的问题:Akka创建一个用于进行异步消息处理的线程池。因此,如果你编写如下代码,你的应用程序永远不会终止,因为Akka继续运行。
class Root extends Actor {
// create some child actors to do some work
override def receive: Receive = Actor.emptyBehavior
}
object Main {
def main(args: Array[String]): Unit = {
val system = ActorSystem("main")
system.actorOf(Props(new Root))
}
}
通常,如果您需要终止应用程序,您将定义一条消息,表明已完成所有工作并将此消息发送给您的根执行者。然后,root actor可以调用context.system.terminate()
来终止系统。
回到你的问题,我不明白你为什么要把Akka和Spring Boot结合起来。你的线程转储,我不确定问题是否与Akka有关。看起来线程挂在HttpClient中。你确定已经释放并关闭了所有打开的连接吗?