OOM故障实战复盘
2022年双十一当天凌晨2点,某电商平台的订单服务突然大规模宕机。
监控告警疯狂弹出:JVM进程OOMKilled,堆内存使用率100%,GC次数每小时超过5000次。
技术团队紧急排查后发现:开发同学在一次需求迭代中,把一个List<Map<String, Object>>的结果集直接塞进了缓存,没有设置过期时间和大小限制。
双十一流量峰值时,这个缓存吃掉了20GB内存。
这次故障导致订单服务宕机2小时,直接损失约500万元。
【面试官手记】
OOM是生产环境最严重的故障之一。我面试过的候选人里,能说清楚"OOM排查方法"的超过50%,能说清楚"OOM根因分析"的不到30%,能说清楚"预防方案"的不到20%。OOM排查的关键词是快速定位 + 彻底解决。
一、OOM的六大类型 🔴
1.1 六种OOM类型
1.2 根因分类
二、Heap OOM排查实战 🔴
2.1 事故现场
2.2 排查步骤
2.3 MAT分析
2.4 Arthas在线排查
三、Metaspace OOM排查 🟡
3.1 事故场景
3.2 排查方法
3.3 解决方案
四、Stack Overflow排查 🟡
4.1 事故场景
4.2 排查方法
4.3 代码问题
五、Direct Memory OOM 🟡
5.1 事故场景
5.2 排查方法
5.3 解决方案
六、生产避坑 🟡
6.1 OOM的五大坑
坑1:缓存没有上限
坑2:大数据查询没有分页
坑3:线程池配置过大
坑4:静态集合持有对象
坑5:资源没有及时关闭
6.2 OOM检查清单
七、真实面试回放 🟡
面试官:遇到过OOM吗?怎么排查的?
候选人(小张):遇到过。
当时是堆内存OOM,先是看监控发现堆使用率持续100%,然后用jmap导出堆转储,用MAT分析。
MAT的Dominator Tree一看,最大的对象是一个HashMap,里面存了5000万个订单。
追溯代码发现是缓存没有设置上限,导致无限增长。
面试官:怎么解决和预防?
小张:两个方向:
一是治标。用Caffeine替代HashMap,设置最大容量和过期时间。
二是治本。分析为什么会缓存这么多数据,从架构上优化。
面试官:如果是Metaspace OOM呢?
小张:Metaspace OOM一般是类加载过多。
常见原因是CGLIB动态代理生成了太多代理类。
排查用jmap -clstats看类加载器,或者用Arthas的classloader命令。
【面试官手记】
小张这场面试的亮点:
排查思路清晰:监控→堆转储→MAT分析
知道MAT的Dominator Tree用法
能区分不同类型OOM的排查方法
OOM排查是P6工程师必备技能,能完整回答的候选人,说明有生产排障经验。
OOM排查的核心是快速定位 + 彻底解决。记住三个要点:
- 分类判断:根据错误信息判断OOM类型
- 工具排查:jmap/jstack/MAT/Arthas
- 预防为主:缓存设上限、资源及时关闭
OOM是生产环境最严重的故障,宁可提前预防,不要事后救火。