当前位置: 首页 > news >正文

记一次内存溢出排查(dump文件)

问题

  • 某天晚上七点多,我们的一个服务节点挂掉了,查看了服务器状态,内存使用异常
  • 此时间段是业务量较少的时间段,仅有此节点挂掉了,另外3个节点正常
  • 我们使用Spring cloud微服务架构,该服务部署了4个节点,一个节点挂掉暂不影响服务的正常使用
  • 使用jps命令查看了 gc 情况
    在这里插入图片描述
  • 使用jmap -dump命令导出了此时的线程堆栈,之后重启了服务,一切正常,没再发现有内存异常增长的情况,确认为偶发事件

分析与解决

  • 同事使用idea打开分析了bin文件,发现是有个对象的实例数量异常,有274万多
  • 初步判断是该对象实例,导致的内存溢出
    在这里插入图片描述
  • 我的idea版本比较低,达不到这么好的分析效果,于是使用jdk自带的jvisualvm打开文件,发现看的东西也比较有限,我们使用的还是jdk1.8,版本太低了
    在这里插入图片描述
  • 重新从网上下载了一个 VisualVM2.0.7,果然效果好很多,能看到线程情况
  • 首先打开软件,load我们的bin文件在这里插入图片描述
  • 可以查看对象内存占用和线程堆栈,这2个最有用。查看了对象占用和引用,发现这个对象的实例都是在集合list里面,再去找引用,就没了
    在这里插入图片描述
  • 看到线程堆栈,打开查看细节,不太方便搜索,就拷贝到vscode里操作,发现该对象只出现5次,初步确定不是大量请求,而是某一个请求导致的
    在这里插入图片描述
  • 根据堆栈里的类名和行数,可以轻松定位到对应的类和行数。逐个排查,排查到第4个发现了问题,参数为空导致查询条件被跳过,查询了两百多万条数据
    在这里插入图片描述
  • 低级代码错误,使用了带判断条件的 eq 方法,不符合当前的业务情况,当证件号码为空时,跳过了此条件
    在这里插入图片描述
  • 解决方法很简单,判断条件前置即可
    在这里插入图片描述

总结

  • 对于内存溢出OOM等情况,如果有保留现场,及时使用命令排查最好
  • 对于生产环境,使用命令导出dump文件,就赶紧重启服务吧。只要有dump文件,基本可以百分百确定能找到问题
  • 首先查看内存占用情况,查看是否有自己的类及实例异常增多
  • 再查看线程堆栈,查看这些类的来源(一般都是查询,集合遍历等)
  • 针对类在线程堆栈里出现的情况,逐个排查,找到对应的类和行数,不难找出问题
  • vs code 打开大的文本文件,很好用

http://www.mrgr.cn/news/59665.html

相关文章:

  • 音视频同步版本【基于音频】
  • C# 企业微信机器人推送消息 windows服务应用程序的使用
  • 量子计算突破:下一个科技革命的风口浪尖在哪里?
  • dolphinscheduler部署(3.0.0版本)
  • xxl-job java.sql.SQLException: interrupt问题排查
  • UE5蓝图中如何同时执行两个事件或者多个事件以及添加特效用蓝图播放
  • RHCE nfs作业
  • C++11实践指北
  • OpsAny社区版与专业版的主要区别是什么
  • 农作物大豆病虫害识别分类数据集(猫脸码客第227期)
  • 基于IMX6ULL开发板LCD点阵显示字符学习
  • C++——string的模拟实现(上)
  • Fofa搜索技巧(理论加实践的整理)
  • TypeError: predict2() missing 1 required positional argument: ‘img2‘
  • 将CSDN博客转换为PDF的Python Web应用开发--Flask实战
  • IDEA中add frame work support被禁用或找不到的解决方案
  • 使用 Axios 上传大文件分片上传
  • 2023年06月中国电子学会青少年软件编程(图形化)等级考试试卷(一级)答案 + 解析
  • 【数据集】全球陆地表面反照率Albedo
  • MIT 6.824 Lab1记录
  • 【LeetCode每日一题】——1791.找出星型图的中心节点
  • 如何录屏?四款录屏软件实测对比
  • 【零售和消费品&软件包】快递包装类型检测系统源码&数据集全套:改进yolo11-HSPAN
  • 简单的udp程序
  • 群控系统服务端开发模式-应用开发-业务架构逻辑开发API建表
  • xss跨站及绕过与防护