前言
不好啦❗ 天塌了❗ 系统崩了❗
快看啊,程序outOfMemoryError
了🙈
我的心里活动:“哈哈哈😀哈哈哈😀终于给我碰上了,这个问题可很少发生啊,又积累一个问题。虽然我昨天发了版本,但是作为公司技术最好,长得最帅的我,代码肯定不出现这个问题。”
不想看废话的直接看【解决过程和方案】 吧
排查过程
theme: juejin
前言
不好啦❗ 天塌了❗ 系统崩了❗
快看啊,程序outOfMemoryError
了🙈
我的心里活动:“哈哈哈😀哈哈哈😀终于给我碰上了,这个问题可很少发生啊,又积累一个问题。虽然我昨天发了版本,但是作为公司技术最好,长得最帅的我,代码肯定不出现这个问题。”
不想看废话的直接看【解决过程和方案】 吧
排查过程
首先肯定是先看日志,根据日志信息可以看到三个关键信息:
1. 业务代码中调用了远程接口
2. 内存溢出outOfMemoryError
3. Arrays.copyOf(Arrays.java:3332)
猜想❔
得到关键信息后,看了代码之后我就和技术经理做了一个简单的讨论
-
技术经理:调用远程接口没有设置超时时间,访问人数突然增多,导致请求阻塞。瞬间一万个请求进来,然后一个万的请求就阻塞了,从而导致内存溢出
-
我的猜想:请求之前没有查询大量的数据,就算请求阻塞也不会占用大量内存,导致
outOfMemory
. 还有就是Tomcat
的线程池也默认200,。就算一万个请求进来,同一时刻也最多处理200个请求,这个200个请求都阻塞的话会造成 系统卡死,但是不会出现outOfMemoryError
呀虽然抛出了一个业务代码的错误,但是并不能肯定就是它引发的
outOfMemoryError
,也可能是其他任务占了太多内存,这个请求只是一根“稻草”
解决过程和方案✔
-
修改启动命令,导出堆信息
定位outOfMemoryError
还得用证据说话呀! 让技术经理在启动命令上加了如下参数-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./heapdump.hprof
再次出现内存溢