记录一次典型oom的处理过程

背景

有同学反馈收到应用RT的报警,其中的流量都来自于网关集群中的一台机器。因为负责网关,就上去看了下并进行排查。整体是一个比较明显的oom,这里只是记录下排查过程,老司机可以略过了。

初步现象

常规步骤,使用top 和jstat -gcutil 能直观的看到在拼命full gc。推测是出现了oom。

初步排查

一开始是用 jmap -histo:live [pid] >a.log 导出当前内存对象,为什么没有直接用jmap -dump:live 也是想偷懒,因为-dump 生成的文件太大,我们的服务器又跑在k8s上面,要拿回本地需要通过ftp 中转,想着能省就省。结果发现这个给后面埋了个大坑。

基于上面的结果,一度怀疑是sentinel 引起的问题。特别是对比了正常的机器上的内存分布

在上面浪费了大量时间,后面回过头看其实ConcurrentHashMap 占比这么高说明是缓存管理出现了问题。

进一步排查

老老实实用 jmap -dump:live,format=b,file=xxx.xxx [pid] 打印出详细的内存堆栈,拿到本地后用 IBM HeapAnalyzer(比较好用) 或者MAT 打开分析。

从上面比较直观看到出现oom的类。这里只是看到单个的类比较大,从源码上看:

会发现有块缓存没有设置长度和失效时间,这个很可能是导致oom的原因。

相关推荐
予枫的编程笔记4 小时前
【Kafka基础篇】Kafka Producer发送机制全链路拆解:从拦截器到网络发送一文吃透
java·kafka·消息队列·分布式消息·producer发送机制·kafka核心原理·消息发送优化
玄〤4 小时前
个人博客网站搭建day2-Spring Boot 3 + JWT + Redis 实现后台权限拦截与单点登录(漫画解析)
java·spring boot·redis·后端·jwt
BigGGGuardian4 小时前
六合一 Spring Boot API 防护框架:防重、限流、幂等、自动Trim、慢接口检测、链路追踪,一个 Starter 搞定
java·后端
HoneyMoose4 小时前
Jenkins 更新时候提示 Key 错误
java·开发语言
rannn_1114 小时前
【苍穹外卖|Day10】Spring Task、订单状态定时处理、WebSocket、来单提醒、客户催单
java·后端·websocket·苍穹外卖
cqbzcsq5 小时前
MC Forge 1.20.1 mod开发学习笔记(战利品、标签、配方)
java·笔记·学习·mod·mc
追随者永远是胜利者5 小时前
(LeetCode-Hot100)461. 汉明距离
java·算法·leetcode·职场和发展·go
人道领域5 小时前
SpringBoot多环境配置实战指南
java·开发语言·spring boot·github
捷利迅分享5 小时前
Android TV 4分屏独立播放电视应用完整开发方案
java
马猴烧酒.5 小时前
【JAVA算法|hot100】栈类型题目详解笔记
java·笔记