實戰CPU占用過高問題定位


服務部署在Linux服務器,定位問題的方法,主要也是使用相關的Linux命令與JDK查看堆棧,GC日志等相關命令。

1.問題發現

top  查看當前服務器各個進程運行占用CPU,內存等情況。

發現PID為26916進程占用CPU過高

2.問題分析

top -Hp 26916,顯示一個進程的線程運行信息列表。

發現進程中以上截圖中的線程占用CPU過高。

如何定位具體什么線程導致?

jstack 分析線程堆棧信息,具體相關命令自行百度。由於堆棧信息中線程PID號是16進制,26929需要轉化16進制。

printf  '%x\n'  26929

 jstack 26916 | grep '6931'  -C5 --color  獲取線程運行的堆棧信息

發現是GC線程占用的CPU,進一步驗證結論,需要查看GC日志以及堆內存信息。

3.問題驗證

jstat -gcutil 26916 1000   打印GC回收日志統計分析

發現FULLGC的次數變化比較大,年老代內存已經溢出

jmap -heap 26916 查看進程堆內存的使用情況

年輕代與年老代的內存已使用完,基本可以定位是頻繁的GC導致CPU過高。

4.問題解決

已經定位到JVM內存不足導致頻繁FULLGC導致CPU使用過高,內存不足還是有大量對象無法回收導致呢?對此,簡單分析了一下。

jmap -histo 26916|less   查看進程中大對象

JVM內存總共500M,B和C占用了將近300M,因此,查看程序是否有大量創建對象和String對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM