我有通過套接字發送文件的非常簡單的應用程序(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