出現場景:
首先是收到雲上的測試項目突然出現了登陸不了的問題,所有的頁面都是空白,加載不出來.
然后linux中的進行了top操作查看cpu使用情況:
此時發現cpu已經的滿載的371%了.
排查過程:
1.首先看了一下雲上tomcat的錯誤日志發現了這個錯誤:OutOfMemoryError: GC overhead limit exceeded
總結了一下是jvm的內存溢出,當時我的代碼中有着許多的流操作,我第一時間懷疑的是流導致的內存溢出
2.使用 printf "%x\n" 9673 打印對應進程的16進制代碼(雖然我后面的排查也沒有用上這個代碼)
3.使用java虛擬機自帶的堆棧跟蹤工具 jstack 9673 > log.txt 打印jvm中的日志信息(建議sz到windows桌面看更直觀)
就是這個文件
4.我看很多人都是使用進程16制的值搜索,更精確的搜索出對應的出錯位置,可是我發現這對我好像沒有什么幫助,我沒有找到具體的出錯位置.
e.g:
上面提到了我知道差不多是在哪個位置出現的問題,所以我直接使用了那個impl的名稱去搜索
然后找到了關鍵所在
5.之后重新閱讀了代碼發現因為邏輯太過復雜和繁瑣,有一處應該使用的map.replace(),測試時寫成了map.put()並且后來也沒有更正回來導致死循環.
重新將代碼更正然后重新發布,不再出現問題.
留在最后:
也可以使用工具visualvm(性能分期)和工具tda.bat(網上看見有人推薦,可以打印出比jvm更詳細的日志方便閱讀),幫助排除錯誤,因為這次我碰到的錯誤比較低級也沒有那么復雜,所以也就不再過多深入了.
自己記錄一下,順便給碰到cpu滿載無從下手的朋友們參考一下.