春招妥了!资深技术面试官教你这样准备 Java 面试! | CSDN 博文精选(11)

第一步 , 发现系统很卡 , 或者日志里频繁出现OOM异常 。

第二步 , 用dump文件看OOM时的内存镜像 , 看的工具可以是JMAT 。 这两个步骤是通用的 。

第三 步 , 通过dump文件 , 再结合日志上下文 , 发现了OOM的原因 , 比较简单的原因是Redis缓存超时时间过长 , 或者是ThreadLocal里的对象用好没remove(这块还涉及到弱引用 , 大家可以自己去查 , 本文不展开) , 或者创建线程池时 , 等待队列设置成了无界 。

或者你在Mybatis里 , where条件都是带if的 , 即如果传入id和name再拼装where id = xxx之类的语句 , 在一种场景里 , 都没传条件 , 所以where后面不带条件 , 把数据库里记录全捞出来了 , 导致OOM 。

如果你甚至可以说到Netty 堆 外内存管理不善而导致的问题 , 如果能说到这个程度 , 甚至面试架构师都行 。

第四步 , 解决 。 发现问题后 , 对症下药解决就很容易 , 比如降低Redis超时时间 , 或者修改好对应的代码 。 但既然你说是根据线上问题排查出来的 , 那么就得说如何解决 , 善始善终 。

推荐阅读