JVM:记录一次因为查询量过大导致的OOM问题(四)
0. 引言
近期系统出现了一个比较经典的OOM问题,特此记录下排查过程以及解决方法,供大家后续参考。
1. 问题现象
首先我们出现问题的服务实际上是基于dataease改造的数据看板模块,该模块被内嵌到项目中。一开始测试同学反馈只要一点击数据看板就会导致闪退,系统直接退出到登录页。
单从表现来看,很容易误导,认为是登录和权限的问题。又因为前一天前端同学刚好改过这块,所以刚开始我们也很“顺利”的定位到是权限的问题,并且推测是cookie中存储的token被删除了,导致内嵌的看板模块拿不到用户token,从而导致退出登录页,连带外面的系统也跳转登录页。
但当前端同学检查过代码后,发现没那么简单。
2. 排查步骤
1、首先前端先对权限中的cookie和token请求头都做了检查,发现确实没问题,也发布测试环境做了验证,也没发现问题。
2、那么权限的问题实际上就排除了,然后跟踪了测试同学的操作,实际上是点击了某一特定数据看板才会导致闪退,而这所谓的“闪退”也不是马上退,而是加载一会出现超时报错后退出到登录页。
从问题现象看很像某个接口超时了,但超时为什么会导致闪退呢?
3、通过模拟发现这个特定的数据看板配置的数据集,其数据量达到了十亿级,而dataease配置的数据看板,默认是查看全部的,十亿级数据一下子查询肯定会导致内存溢出问题。但是这只是推测,我们还要找证据。
4、于是先去服务中把dump日志导出了下来,因为我们是通过docker部署的,所以需要通过docker cp
指令将日志复制到宿主机。
这里如果没有开启dump日志的,可以提前开启,其配置是在jar启动参数中添加-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=dump.hprof
。或者通过jmap
指令导出dump日志。
jmap -dump:format=b,file=文件名 进程pid
因为导出dump日志会导致STW,即导出的时间段内业务无法运行,所以这里如果没有提前开启,线上又不允许业务中断的话,可以通过jstack
指令查看堆栈信息来排查,具体可以参考我JVM系列第一篇文章:
JVM:全面理解线上服务器内存溢出(OOM)问题处理方案(一)
5、将dump日志导出后,准备用mat工具来分析日志,但是因为日志文件比较大,所以提前设置mat的运行内存为8G, 这个设置是需要通过更改MemoryAnalyzer.ini
中的内存配置,将内存增加一些
如果你是mac系统,可以在mat程序右键,点击显示包内容
,就可以看到该配置文件
mat程序打开后,点击Open a Heap Dump
,然后选择你的dump日志文件
然后选择Leak Suspects Report
即可
6、在mat中,首先可以看到主要是这个TaskThread
对象占用大导致内存溢出。但是这个只能看出是tomcat下的线程任务,找不到关键信息,继续分析。
7、我们点击回到首页,点击``Unreachable Objects Histogram`查看不可回收的对象主要是哪些
可以看到主要是Map中承装的字符串不可回收,字符串使用的地方很多,所以这里也不是特别清晰,但这里我结合业务情况实际上已经有怀疑的方向了,因为该服务是用来做数据看板的,包含了数据集的集成和查询,线上集成了一个数据量很大的数据集,有点怀疑是查询该数据集的时候因为查询数据量太大了导致的内存溢出,但这个只是怀疑,我们还得继续找实质的证据。
8、我们回到Leak Suspects
,点击Details
查看详细的线程分析信息
往下挪可以看到线程栈日志,到这里我们想要的“证据”就有了,可以看到是getData
方法调用时导致的内存溢出,经过代码对比,该方法就是查询数据集的方法,数据通过getString方法做匹配转换成String, 所以上面出现字符串最多未回收,因为就是用字符串来承装的。
9、那么代码位置定位到了,剩下的问题实际上就很好解决了,首先集合前端调用的入口发现,该请求访问时默认是访问表全部数据,而这个数据集单表有10亿数据,这个程序总共才设置了1G的内存,肯定导致内存溢出,于是调整默认查询1000条,并将程序jvm内存xmx参数
调整到2G
10、最终重启服务,再次测试访问,未出现OOM现象,问题搞定!
总结
其实整个分析过程是比较顺利的,一是因为该问题埋的不深,二是因为本身对业务有一定了解,大概会猜测出现问题的点,所以在排查时顺着怀疑方向会快速很多。后续大家在排查此类OOM问题时,也可以先了解有风险的业务点,有一定的预估后进行排查会顺利很多。
原文地址:https://blog.csdn.net/qq_24950043/article/details/144683180
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!