服務部署在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對象。