問題描述:
我們公司是java做服務端,做的電腦客戶端軟件,最近一次更新,測試時發現之前cpu一直是在4-5使用率,新版本有時會飆升到30%~40%,肯定是存在問題
使用工具:
步驟1:定位項目進程
打開任務管理
步驟2:使用jdk自帶的一個jstack命令導出線程日志
命令: jstack 88400 > D:/jstack/cc.log 88400:任務管理里的項目PID,右側是將進程保存到本地,供后續排查問題
注意:
1、文件夾要先創建好,
2、如果出現拒絕訪問,則需要使用管理員身份運行cmd
3、如果出現jstack不是內部或外部命令,則說明jdk的環境變量設置有問題,在這就不多說了
步驟3:使用Process Explorer工具,下載地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer
找到步驟一中的PID對應的進程,右鍵Properties...選項
找到CPU使用率高的TID,通過jstack工具導出的信息中線程TID是十六進制的,需要轉換進制
將16進制到之前導出的線程記錄文件中查詢,可以看到我自定義的線程名以及代碼位置,可以追蹤到具體業務邏輯進行排查問題
我之前的問題是開了線程池處理一個隊列里的數據,當隊列無數據時沒有休眠等待,導致線程一直再跑,CPU飆升。