周一刚坐上工位半小时就在群里收到了,服务请求不到的问题
看了一下还好不是核心业务
于是便打开k8s 进入到具体容器当中
jstat -gcutil xxx
JVM看到Eden 和 Old区全部满了
jmap -dump:format=b,file=/xxx/xxx 17
导出文件到服务器,然后执行重启,恢复服务
然后使用jvisualvm解析dump文件
看到居然有这么多的Long类型,定位到具体的类,就是下面的ExcepitonExpress
然后在项目中全局查找ExecptionExpress
解释一下具体的业务
就是收集异常快递,然后启动一个单线程去推送消息
一开始我觉得是消费堆积了,开多几个线程就完事了,后面我用arthas一抓
好家伙怎么抓不到啊
后面详细看了一下代码,消费者那边是这样的
batchUpdate方法也全部用trycatch了也不会出现《消费者中断的问题吧》
但是结合了arthas抓不到的问题,我再看看最后一次消费的日志是什么样的
好家伙一看不知道,一看吓一跳,这是初始化方法没找到啊!
这段代码难道是被人动过吗?
再看看代码结果发现最新的变动还是2年前。
于是我开始去看看对应的lib包,以为是jar包被人变动了
看到了这边有好多个相同的common包,结合异常出现的日期Jul 23日
common包有0.01和1.0.0另两个版本。
后面看了一下这两个common包的初始化方法不一样,存在lib包下,tomcat会加载最近的一个jar包,于是就先加载了旧的0.0.1版本
临时解决方案
升级exception为throwable 重新发布解决啦~