服务最近隔一段时间会出现java.lang.OutOfMemoryError: Java heap space异常。
初步猜测发布新版本功能后存在内存泄露代码。
排查方法如下:
1.通过jmap导出dump文件
2.通过mat分析,发现部分堆内存占比过大
问题出现在AbstractAutoProxyCreator的advisedBeans这个方法
3.分析业务代码定位到 一个返给前端动态html的接口
这个接口用的是@Controller
如果接口返回的是模板路径或者是相对固定的字符串不会出现问题。
但是一旦返回的是动态html代码或者是动态的路径。会通过springmvc的AbstractAutoProxyCreator的advisedBeans方法把动态生成的内容添加到其内部的集合里面,久而久之,导致oom问题。
4.解决方案
业务接口需要返回html代码,所以如下改进。
接口添加:@ResponseBody以及produces = "text/html;charset=UTF-8"
通过明确返回数据的配置,不去调用此默认方法。猜测此方法的设计初衷应该是为了配和模板引擎使用。路径相对固定。