Java服務(wù)cpu100%的解決過程分享
背景
最近一個任務(wù)是優(yōu)化一個導(dǎo)出的功能,但是點擊功能時發(fā)現(xiàn),程序長時間無反應(yīng),過一段時間又有反應(yīng),通過查看服務(wù)的監(jiān)控發(fā)現(xiàn),服務(wù)存在cpu持續(xù)100%的情況,下面分享一下我的處理方案和過程
處理過程
1.程序cpu監(jiān)控圖
2. 定位 通過查看cpu的使用率發(fā)現(xiàn)服務(wù)cpu100%的情況,卻在兩個節(jié)點上都存在問題,于是查看cpu情況
a. 登錄服務(wù)器執(zhí)行top命令,查看cpu使用率
-- 此圖非100%時截圖
b. 使用to -Hp [pid] 命令查看具體的線程占用cpu情況
我們可以看到506和856較高
c. 執(zhí)行 printf "%x\n" [線程id] 將線程id轉(zhuǎn)換成16進制,并在前綴前+0x,目的是等下在線程日志里面找到對應(yīng)的線程具體信息,cpu最高時當時我得到的線程16進制為0x1a8
d. 執(zhí)行jstack [pid] > jstack.txt
e. 通過c步驟得到的0x1a8查詢jstack.txt
線程日志發(fā)現(xiàn),這個線程其實是GC線程,也就說明存在fullgc導(dǎo)致了cpu持續(xù)過高,而fullgc都是由大對象導(dǎo)致的,這就以為這系統(tǒng)中存在著大對象。
f. 查看jvm內(nèi)存情況
存在內(nèi)存快照上找到了大對象
g. 查看程序日志
發(fā)現(xiàn)這個定時任務(wù)一直在執(zhí)行,在類中發(fā)現(xiàn)了和大對象相同的類
e. 找到原因,此定時任務(wù)一次性查詢20多萬條數(shù)據(jù)到對象中,導(dǎo)致fullgc,關(guān)掉定時任務(wù),服務(wù)恢復(fù)正常
結(jié)語
本次問題的原因是fullgc導(dǎo)致cpu使用率過高,對于cpu過高的異常很多都是偶現(xiàn)的,所以不太容易排查,因為基本都要在出現(xiàn)100%時才能看到哪些線程出問題。
以上就是Java服務(wù)cpu100%的解決過程分享的詳細內(nèi)容,更多關(guān)于Java服務(wù)cpu100%的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
knife4j3.0.3整合gateway和注冊中心的詳細過程
這篇文章主要介紹了knife4j3.0.3整合gateway和注冊中心的詳細過程,本文給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03Java布爾值Boolean和boolean之間轉(zhuǎn)換實例用法
在本篇文章里小編給大家整理的是一篇關(guān)于Java布爾值Boolean和boolean之間轉(zhuǎn)換實例用法內(nèi)容,有需要的朋友們跟著學(xué)習參考下。2021-06-06圖解Spring框架的設(shè)計理念與設(shè)計模式
這篇文章主要通過多圖詳細解釋Spring框架的設(shè)計理念與設(shè)計模式,需要的朋友可以參考下2015-08-08SpringBoot+Redis實現(xiàn)接口防刷的示例代碼
在實際開發(fā)中,會出現(xiàn)用戶多次點擊發(fā)送請求,本文主要介紹了SpringBoot+Redis實現(xiàn)接口防刷的示例代碼,具有一定的參考價值,感興趣的可以了解一下2024-01-01SpringBoot 動態(tài)配置郵箱發(fā)件人過程解析
這篇文章主要介紹了SpringBoot 動態(tài)配置郵箱發(fā)件人過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下2019-08-08