问题描述
提示:这里描述项目中遇到的问题:
在某一天下午,公司钉钉群突然很多人反馈,系统很卡,响应很慢。于是我火速连接上服务器,发现服务正在疯狂执行GC,但是效果并不显著,堆空间也快占满了,满屏的 Full GC,此刻应该是一直处于STW(STOP THE WORLD),所以系统无响应。
问题排查
1.先别着急重启服务,先导出此时栈信息以及堆信息
先输入 `jps` 找出当前进程的pid
导出栈信息到statck.txt文件 `jstack -l pid > stack.txt` 或者 `jstack -F pid > stack.txt`
导出堆空间信息到filename.hprof文件 `jmap -dump:live,format=b,file=filename.hprof pid`
2.导出后,使用MAT分析工具(http://www.eclipse.org/mat/downloads.php)打开filename.hprof
勾选这个选项,生成分析报告
如果内存不够大话,会报错,那么去配置文件,修改最大内存大小即可
点击 Histogram
发现是HashMap占用的绝大部分的内存
点击树状引用
发现有一条查询SQL,猜测应该是一次查出来很多数据,同时放到map里去了
点击小齿轮
找到内存占用大的线程,逐步往下找,看看在执行什么操作,我们可以看到,执行了人事档案中的某一个方法,方法的行数,以及参数类型,我们都可以找到,最后定位到相应的代码即可。
方法详细参数
我们也可以在刚刚的树状列表里找到,这个方法的传参
原因分析:
提示:这里填写问题的分析:
最后定位到具体的代码,发现是一下子查询了太多的数据,导致的堆空间内存不足,最后修改为分页导出。