我有通过套接字发送文件的非常简单的应用程序(2个参与者)。应用程序使用Spring Boot和Akka,传输完成后,没有其他事情发生。不过,即使在传输之后,我也注意到CPU占用率过高(例如4核心机器上的50%,即2个内核)。我捕获了活动线程的快照,其中约三分之一属于Akka。当没有任何事情发生时,Akka会做什么?
Akka在做什么,为什么需要这么多cpu?
我有通过套接字发送文件的非常简单的应用程序(2个参与者)。应用程序使用Spring Boot和Akka,传输完成后,没有其他事情发生。不过,即使在传输之后,我也注意到CPU占用率过高(例如4核心机器上的50%,即2个内核)。我捕获了活动线程的快照,其中约三分之一属于Akka。当没有任何事情发生时,Akka会做什么?
Akka在做什么,为什么需要这么多cpu?
一般回答你的问题:阿卡创建它是用来做异步消息处理线程池。所以如果你编写如下代码,你的应用程序永远不会终止,因为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))
}
}
所以平时如果需要终止您的应用程序将定义哪些信号,所有的工作已经完成,并发送此消息给你的根演员的消息。然后根主角可以调用context.system.terminate()
来终止系统。
回到你的问题,我不明白你为什么要结合Akka和Spring Boot。你的线程转储,我不确定问题是否与阿卡有关。它看起来像线程挂在HttpClient内部。你确定你已经释放并关闭了所有打开的连接吗?
发布您的代码请 –
请注意,虽然所有这些线程都是'WAITING'(https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.State.html),所以他们正在占用你CPU的50%很可能是一个不正确的结论。 – johanandren