前言
最近遇到一個java應用造成了服務器cpu使用率過高,最后查詢,問題是因為在tomcat下重新部署應用的時候沒有kill掉tomcat進程,造成應用中的數據庫連接池進程中的鎖不能被釋放,死循環造成了cpu使用率過高的現象,詳細原因就不做詳細分析了,主要分享一下問題排查的過程。
使用top命令查詢服務cpu使用情況
服務器資源使用率
可以看到31737這個進程的cpu使用率巨大
使用top -hp 31737查詢31737進程中各個線程的資源使用率
1
|
top -hp 31737 |
使用top -hp 31737查詢31737進程中各個線程的資源使用率
31737進程中各個線程的使用率
由于當時的截圖丟失了,簡單說一下,使用top -hp 31737命令查詢到31737進程中,一個線程id為5322占用cpu過高
使用printf "%x\n" 5322把線程id轉化為十六進制
1
|
printf "%x\n" 5322 |
因為打印線程棧的時候,本地線程標識nid是用十六進制表示的,使用該命令把線程id轉化為十六進制
5322的十六進制為14ca
使用jstack命令打印堆棧信息
1
|
jstack 31737 | grep - 10 14ca |
使用jstack 31737 | grep -10 14ca打印31737的堆棧信息,并查找本地線程標識為14ca的線程堆棧信息
31737的堆棧信息
如圖,線程的狀態為timed_waiting,對象等待中,查看源碼
出現問題的代碼
發現問題的原因就不做詳細分析了,這里主要是分享一下問題排查的過程
度娘一下有個大神回答的不錯,連接在這里,有興趣的可以自己去看一下https://stackoverflow.com/questions/6981564/why-must-the-jdbc-driver-be-put-in-tomcat-home-lib-folder/7198049#7198049
大神的回答
大致原因就是因為在tomcat下重新部署應用的時候沒有kill掉tomcat進程,造成應用中的數據庫連接池進程中的鎖不能被釋放
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:https://www.jianshu.com/p/127685d40dba