記憶體和棧溢位問題定位

請編寫你的暱稱發表於2020-10-07

記憶體洩露和棧溢位問題定位

記憶體洩露

  1. 記憶體使用率在90%以上,通過監控工具apm檢視到一臺虛擬機器上應用頻繁在發生了全域性GC(FullGC),導致應用假死,不在接受請求。此時登入虛擬機器
  2. 記憶體dump
    ps -ef | grep appName,獲取程式ID
    /usr/local/jdk/bin/jmap -dump:format=b,file=m.hprof pid(程式號)
  3. 使用mat分析dump檔案
    參考資料:https://blog.csdn.net/alli0968/article/details/52460008

棧溢位

  1. 現象:一個後端服務,每天都出現程式死掉。並且部署了該應用的後端服務都發生過程式死掉,通過監控apm發現,每次程式掛掉時間都是凌晨2點。
  2. 分析:每臺伺服器都發生過,且發生時間都是凌晨2點,說明程式死掉和虛擬機器關係不大,有可能是定時任務。檢視/var/log/message系統日誌,除了看到程式掛掉時間,沒有其他有用日誌。
  3. 問題定位:ulimit 它是一種簡單並且有效的實現資源限制的方式,修改ulimit值為無限大,用於問題定位。第二天,程式又出現掛掉,檢視/var/log/message系統日誌,看到裡面出現stack over flow即棧溢位,結合發生時間,基本可以確定是定時任務導致。當時定時任務在進行資料歸檔,根據最近幾天歸檔的資料發現都是歸檔完成第42條資料後,程式死掉。應該是第43條資料歸檔出現了問題,模擬現網環境資料,本地執行出現了stack over flow,發現是一個遞迴函式無法退出導致。

相關文章