一 发现问题
1、最近预发机器发生了一次莫名其妙的内存溢出,可以从下图看出在下午17:19分左右开始疯狂的FGC。

2、内存的监控可以看的更明显,在17:19分old直线上升,因为之前出现过metaspace区不够的情况,一开始以为又复现这个问题,在检查相关,dump内存和metaspace保留现场证据后,18:00左右重启机器,然后内存又上去了,这个时候压力徒增。因为升级了jdk,难道和此次升级jdk有关?

但是预发环境在前一天已经部署了新版本jdk,跑了这么久,理论上不会突然出现这种问题。但是内存飙升实在太快了,看起来不像系统应用所为。在重复检查毫无头绪后,再次尝试重启,内存回归正常水平。
二 原因分析
那么这次到底是什么原因呢,毕竟马上就要发布到线上了。如果是本次升级jdk导致的,我们需要立马回滚jdk版本。
1、因为之前出现过metaspace区溢出的问题,首先分析了dump的metaspace,发现没什么异常。
2、紧接着分析dump出来的内存信息,首先从图中已经可以看到了可疑点1占用了79.8%的内存

过滤出可疑点的类org.apache.tomcat.util.threads.TaskThread

右键查看引用的old区对象

查看对象内容

可以得到关键字eveNumber。最终在代码发现了这段代码,当subStockInfoStr值是"20190801-20190901/000000-235959/10",会导致下面的while陷入死循环,不停的newJSONObject,打爆了内存。

同时线上数据里面的工单操作记录也证明是业务方操作导致,18:00服务器刚起来后,又操作了一次,导致内存又飙升,吓死哥了~

网友评论