文章出處
文章列表
前一陣遇到了一個很坑的內存泄露問題,記錄于此:
有個項目采用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" }
文章列表
全站熱搜