线上jvm假死问题排查

1.线上告警接口超时

看接口是用户服务,查看nacos服务实例,发现有一个节点已经下线了

3.找到对应节点所在服务器,jps -l 命令发现用户服务还在,初步判断是假死

4.使用 jstat -gc 进程id 1000 每秒打印gc情况,发现频繁full gc,平均3秒一次,然后每次gc时间大概3~4秒

5.jmap -heap 进程id发现新生代和老年代都满了,紧急生成堆转储 jmap -dump:format=b,file=heapdump.hprof ,然后重启服务

6.使用MAT分析堆栈信息,排查内存泄漏的问题,看到分析是mysql查询时有占用了1.1G左右,jvm才配置了2G,当时想到可能是无条件查询导致查询了大量数据

7.继续排查看到线程的堆栈指向的业务代码是查询用户,看了下相关逻辑是有传手机号码查询用户的

8.由于是查询数据库占用了大量堆内存,所以判断当时查询肯定是很慢的,所以看了阿里云数据库的慢sql记录,果然发现查询返回了150多万数据

9.看了具体SQL是手机号码传1,使用的是模糊匹配,导致所有用户都查出来了

复制代码
select * from user where mobile LIKE '%1%'

10.调整代码为不使用模糊搜索,解决问题

复制代码
select * from user where mobile = '1'
相关推荐
wangchunyu1144 小时前
JAVA JVM内存结构与运行时数据区
java·开发语言·jvm
骑着蜗牛撵大象3276 小时前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph
lambo mercy8 小时前
持久化01——线程级持久化
java·开发语言·jvm
Pniubi10 小时前
JVM的构成精讲
jvm
今天的砖头有点烫手啊1 天前
Java 对象内存布局:压缩指针、对齐填充与 JOL 实测
java·jvm
凯凯姜2 天前
JVM 内存持续增长与 Full GC 频繁
jvm
驭渊的小故事2 天前
从 JVM 底层看泛型:泛型擦除、Signature 属性与 Super Type Token 模式
java·开发语言·jvm
香蕉大香蕉(06敬畏市场)3 天前
高频八股 · Java 并发编程(10):异步、ThreadLocal 与虚拟线程(收官)
java·开发语言·网络·jvm·python·ai·实习
wuminyu3 天前
JVM规范学习总结-Class文件结构
java·linux·c语言·jvm·c++
酌沧3 天前
MemT让记忆成为模型内生能力
jvm·人工智能·算法