线上环境内存泄露问题排查报告(线上环境内存泄露问题排查整改报告)
导语:线上环境内存泄露问题排查
背景
线上应用A 接连失去响应,导致访问连接积压。该服务在线上环境部署了两个实例,每个实例都有同样的问题,在不重启应用的情况下,基本两周出现一次。
排查过程
1 拉取了出现问题时服务的监控情况,如下:
1.1 grafana监控内存使用及gc情况:
cpu占用情况
内存使用情况
gc次数
gc耗时
从上面监控信息可知,在一段时间中,服务器CPU一直占用很高,JVM堆内存一直占用很高,同时full gc又相当频繁,但是堆内存释放量却很少,看到这里已经怀疑内存中有大量无用对象一直无法被回收(内存泄露),从而导致程序响应慢。
2 获取dump文件,并通过Jprofiler工具定位问题所在
发现大对象(见上图),占1.5G左右(70%),进入到该对象的引用,见下图:
发现大量standardSession对象,查看tomcat源码发现,standardManager下有变量:protected Map<String, Session> sessions = new ConcurrentHashMap<>();获取session时会将session存入map中,与dump引用对象比较吻合。StandardManager管理session,会有线程每隔60秒执行一次回收,针对过期的seesion(最大过期时间内未访问该session)
由此,基本是可以断定是session未回收导致。
3 查看服务关于session的配置
session过期是时间设置的有问题,该服务不需要用session做用户鉴权,可以将session过期配置去掉,用默认的过期时间即可。
总结
1 web项目中使用session管理,注意session的使用,合理配置过期时间;
2 session中不要存放大对象;
3 可以考虑使用外置session管理及存储。
本文内容由小思整理编辑!