# 内存溢出案例:系统卡顿,客开队列消费太慢导致频繁GC
# 问题现象
客户上周日刚完成系统升级,有打定制开发代码。
周一上班,上午使用正常,中午突然出现大面积卡顿:几乎所有功能打开都很慢,各种报异常。登录服务器检查发现OA所属的java进程还存在(说明系统没崩,只是卡),由于事出紧急,立即做了OA重启,重启后用户使用正常。
周一下午客户使用也正常,到接近下班的时候又出现中午一模一样的现象:
# 抓取问题
首先,所有系统卡慢宕机分析都可以参考文档 https://open.seeyoncloud.com/v5doc/142/1189/1149.html (opens new window) 分析排查。
已确认,中午系统卡顿时,Java进程存在,重启就就正常。故问题可以基于“Java进程存在”排查。这种情况推荐部署SeeyonDump工具,并重启OA以激活工具。
由于客户紧急重启,未部署SeeyonDump工具。则此时需要持续关注系统性能,通过系统管理员-系统监控,每隔一小时导出系统监控信息、jdbcdump、Threaddump,分析问题出在哪里。
如下截图是客户中午重启,使用3小时后的系统监控,可以看到G1 Old Gen年老代内存使用90%,说明系统内存又即将濒临溢出。
PS:正常系统Used Ratio使用率一般都在70%以内,很多是30%。
基于这个图,已经无需分析别的问题,这个内存占用57.44G一定是问题!
# 分析问题
最严谨分析Old Gen年老代内存占用的问题,就是如下办法:
- 1)不要重启OA,在问题出现的时候,立刻使用jmap命令导出当前系统的内存dump(如客户这个问题,导出的文件大小一般会超过57.44G,注意预留足够磁盘空间)
- 2)找一台内存在80G(57.44G×1.5倍)以上的Windows终端或服务器分析(分析内存非常占用资源)
- 3)Windows系统安装jdk、安装MAT工具,使用MAT工具进行内存分析
- 4)待MAT分析结果出来后,将结果取出解读即可
使用MAT工具分析内存问题参考文档 : https://open.seeyoncloud.com/v5doc/142/1189/332.html (opens new window)
如下是使用MAT工具分析过程,由于内存占用过大,整个MAT工具分析耗费了1小时:
分析结果是一份html报告,一般MAT工具中标记为Problem Suspect都是有问题的区块:
通过See stacktrace链接能看到程序具体调用链路,找到与产品有关的关键字,分析源代码即可。
如下堆栈可以确定com.seeyon.apps.kk.task.KKNewsTask或其下的实现存在问题,程序将大量对象写入到Jvm内存中,未来得及释放导致问题产生,通过对应业务功能的开发进行代码调整来解决问题即可:
对应业务的开发修复问题并将补丁推送到客户系统次日,查看系统监控,内存问题不再出现: