背景:
项目中有业务数据需要推到下游系统,需要初始化最新一版数据,数据量为三十几万,大小大概为1G,恰好系统UAT环境被运维同事只设置了512M,然后就出现了OOM的情况。虽然能加内存处理,但是总是感觉是代码出现了问题,所以只能还原UAT的项目启动参数在本地排查问题。
1、首先设置最大堆内存512m
2、看这段代码,咋一看没什么大的问题
3、接下来我们开始调接口,打开java jvisualvm看一下内存图
这时候内存已经开始飙升,垃圾回收器已经无法回收,最终报出了内存溢出
4、利用JProfiler分析堆内存溢出日志,最终定位到罪魁祸首
5、最后看一下内存图,没有明显的上升趋势,垃圾回收器已经将局部变量的没用对象回收
总结:while循环内的对象变量会随着类的存在而一直存在,即使循环结束了,也不会自动释放,只有当类结束了才会消失,换言之,即会占用内存,大家以后在使用while循环定义这种对象变量时一定要clear掉,避免产生生产事故(如果是要循环的话也可以考虑使用for循环)