Java問題排查(運維篇)

  每一位開發想必都會遇到線上服務告警,而導致這樣原因的肯能有流量增加或是代碼中bug異常沒有抓住導致,而此刻我們就需要去排查問題。

1:業務增加,導致FGC頻繁發送,如果不知道如何查看FGC的話,可以參考之前寫的:Jstat查看MinorGC和FGC使用詳解,點擊即可。這裏不做重新複述。當發現FGC的次數頻繁很高,這裏說明了需要優化JVM來減少FGC的次數;而這種問題不是個人原因導致的線上問題,所有一帶而過。

2:個人代碼導致的服務告警,如何排查:

第一步:我想普遍都是先使用Top來查看CPU的使用率:



第二步:找出cup使用最高的pid 也就是第一列,然後jstack pid |fgrep pid(這裏需要轉16進制 printf  “%x\n”)


這裏解釋一下jstack的結果:
關於線程狀態需要關注的有;
死鎖 Deadlock ;等待資源,Waiting on condition;等待獲取監視器,Waiting on monitor entry;阻塞,Blocked(重點關注)

如果是Blocked就是等待資源超時,這裏由於沒有現場的截圖,只能描述一下,就是state 狀態中是:  java.lang.Thread.State: BLOCKED (on object monitor)


如果是Runnable的話:一般指該線程正在執行狀態中,該線程佔用了資源,正在處理某個請求,有可能正在傳遞SQL到數據庫執行,有可能在對某個文件操作,有可能進行數據類型等轉換。

如果是Wating on condition; 

 

當你的堆棧信息出現這樣的話你就可以基本發現是出現了死鎖,還是阻塞,從而定位到代碼中








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章