10.21

项目上线第三天,服务突然挂了,日志里是java.lang.OutOfMemoryError: Java heap space。记录下排查过程。

第一步,保留现场。别急着重启,先jps找到进程号,然后jmap -dump:format=b,file=heap.hprof 导出堆快照。重启了现场就没了。

第二步,看监控。Grafana上看到堆内存持续上涨,Full GC越来越频繁但回收效果越来越差,典型的内存泄漏。

第三步,分析快照。用MAT打开hprof文件,看Dominator Tree,找到占用最大的对象。发现是一个ConcurrentHashMap,里面存了上百万个key。

第四步,定位代码。这个map是用来做本地缓存的,但只put不remove,也没设过期时间。用户量一上来就爆了。

第五步,修复。换成Caffeine,设置最大容量和过期时间。重新上线后堆内存稳定。

经验教训:本地缓存一定要设上限和过期;上线前压测;JVM参数加-XX:+HeapDumpOnOutOfMemoryError,出事自动dump。排查OOM不可怕,可怕的是没留现场。

posted @ 2026-10-21 16:43  一水尘风  阅读(3)  评论(0)    收藏  举报