Java服务CPU飙到99%问题排查
原文鏈接:http://www.jianshu.com/p/e96c74133be6
一大早剛來到公司工位上,電話響起來了,一看是運維老濕打過來到,緊張的接起電話,小心臟撲通撲通跳?!靶÷钒?#xff0c;你有個服務CPU飆到99%,現場給你保留了,趕緊看看吧!”掛了電話一看短信,果然有告警過來了!還好服務沒有重啟,現場保留了,趕緊上到服務器上看看。看到是一個用戶評分的服務,六臺機器的其中一臺CPU飆升,下面介紹一下問題排查的過程和解決方法。
一、查看導致CPU飆升的線程
首先需要定位到是服務里的那些線程導致CPU飆升的。具體查找方法:
1、在服務器上通過jps -l可以查到服務的進程號。
2、查到對應的進程號,通過top -H -p $pid,可以看到具體是哪個線程占用了CPU,記下該線程的id。
二、查看對應線程的java堆棧信息
根據找到的線程,可以去查看對應的java堆棧信息,來進一步定位是哪一段代碼出現了問題。
通過jstack -l $pid可以查看java進程的堆棧信息,這里的pid是進程號。
在堆棧信息中nid指的就是線程id,但是這里的線程id是16進制,我們之前獲取的線程id是10進制的,需要轉換一下,比如我查到線程id是14533,轉換后是38c5,所以在jstack -l結果中查看38c5這個線程。
去代碼里一看原因其實很簡單,多線程環境下使用了非線程安全HashMap,導致了這個問題,但是使用HashMap怎么會跑滿CPU呢?去查了一下才知道,HashMap在多線程環境下reHash時,可能會導致死循環,具體的分析這里就不再展開了,想了解的同學可以看下這個博客:HashMap 死循環分析。
解決的方法也很簡單,將原來非線程安全的HashMap替換成線程安全的ConcurrentHashMap就行了。
解決后發布,并將錯誤原因和修復結果反饋給運維老濕,老濕夸獎了我的響應迅速~
這個錯誤告訴我,不要用主觀的猜測去多線程環境下代碼的工作方式,只要是多線程,一定要使用線程安全的類。
總結
以上是生活随笔為你收集整理的Java服务CPU飙到99%问题排查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux Redhat5.7系统配置网
- 下一篇: 记一次线上Java程序导致服务器CPU占