文章出處

前一陣遇到了一個很坑的內存泄露問題,記錄于此:

有個項目采用spring cloud重構后,部署到線上(其中有一個接口,大概每天調用量在1千萬次左右),發現zabbix監控里,linux的可用內存一直持續下降,每次重啟后,大概能撐1天,就算業務高峰過去了,內存也不見回收,曲線圖如下:

點擊看原圖

發生故障時,用top -m 看java進程占用的內存并不算高,而且spring boot的acurator端點監控,以及jvm的內存監控都在正常值范圍內,剛開始懷疑是jvm參數設置不合理,調整了G1垃圾收集器各種參數組合,沒有明顯效果,然后嘗試換回CMS收集器,再折騰了幾天,仍然如此。用dump導出來分析,線程數、大對象啥的都不高,遂懷疑是spring cloud的坑。

 

攀墻出去google了下,無意搜索" spring boot memory leak",發現有些人遇到了類似的問題,共同點都是embed tomcat + standalone jar運行方式,于是懷著試一試的心理,把容器換成了undertow,居然穩定了!

點擊看原圖

附,更換方法:

    compile('org.springframework.boot:spring-boot-starter-web') {
        exclude module: "spring-boot-starter-tomcat"
    }
    compile('org.springframework.boot:spring-boot-starter-undertow')  

注:其它jar包也有可能隱式依賴了tomcat,保險起見最好加一個全局的排除處理

    configurations {
        all*.exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat"
    } 

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()