spring boot + embed tomcat + standalone jar的內存泄露問題


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

有個項目采用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"
    } 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM