一,對問題進行更加清晰定義:
- 首先查看服務時突然變慢還是長時間運行後觀察到變慢?類似問題是否重複出現?
- “慢”的定義是什麼,是系統對其他方面請求的反應延時邊長嗎?
二,清理問題的症狀,這更便於定位具體的原因,有以下思路:
- 問題可能來自於JAVA服務自身,也可能僅僅是受系統裏其他服務的影響。初始判斷可以先確認是否出現意外程序錯誤,例如檢查應用本身的錯誤日誌。
對於分佈式系統,很多公司都會實現更加系統的日誌,性能等監控系統。一些JAVA診斷工具也可以用於這個診斷,例如通過JFR(Java Flight Recordea>),監控應用是否大量出現了某種類型的異常。
如果有,那麼異常可能就是這個突破點。
如果沒有,可以先檢查系統級別的資源等情況,監控CPU,內存等資源是否被其他進程大量佔用,並且這種佔用是不符合系統正常運行狀況。 - 監控JAVA服務自身,例如GC日誌裏面是否觀察到Full GC等惡劣情況出現,或者是否Minor GC 在變長等;例用jstat等工具,獲取內存使用的統計信息也是個常用手段;利用jstack等工具檢查是否出現死鎖等;
- 如果還不確定具體問題,對應用進行Profiling也是個辦法,但因爲它會對系統產生侵入性,如果不是非常必要,大多數情況下並不建議在生產系統上進行。
- 定位了程序錯誤或者JVM配置的問題後,就可以採取相應補救措施,然後驗證是否解決,否則還需要重複上面部分過程。
參考: java核心技術36講