背景:
項目中有業(yè)務數據需要推到下游系統(tǒng)粤蝎,需要初始化最新一版數據碰缔,數據量為三十幾萬赋除,大小大概為1G瓤鼻,恰好系統(tǒng)UAT環(huán)境被運維同事只設置了512M,然后就出現了OOM的情況贤重。雖然能加內存處理茬祷,但是總是感覺是代碼出現了問題,所以只能還原UAT的項目啟動參數在本地排查問題并蝗。
1祭犯、首先設置最大堆內存512m
2、看這段代碼滚停,咋一看沒什么大的問題
3沃粗、接下來我們開始調接口,打開java jvisualvm看一下內存圖
這時候內存已經開始飆升键畴,垃圾回收器已經無法回收最盅,最終報出了內存溢出
4、利用JProfiler分析堆內存溢出日志起惕,最終定位到罪魁禍首
5涡贱、最后看一下內存圖,沒有明顯的上升趨勢惹想,垃圾回收器已經將局部變量的沒用對象回收
總結:while循環(huán)內的對象變量會隨著類的存在而一直存在问词,即使循環(huán)結束了,也不會自動釋放嘀粱,只有當類結束了才會消失激挪,換言之辰狡,即會占用內存,大家以后在使用while循環(huán)定義這種對象變量時一定要clear掉垄分,避免產生生產事故(如果是要循環(huán)的話也可以考慮使用for循環(huán))