记一次线上fullgc排查历程

2023-11-09

在公司一次重大项目中,生产环境突然发生频繁fullgc问题,通过cat发出警告。很不幸,这次项目非常重要,领导很看重,所以得赶紧解决问题,下面就是排查的艰苦历程

22:10 线上可以报警,出现fullgc问题,初步判断是服务器少了,于是申请堆线上服务器进行扩容,扩容之后,还是有fullgc问题

22:30 初步通过代码判断是自己查询了大对象导致老年代内存快速增长,目前业务中只有一个地方老年待,于是盲目改代码:一次查询修改成分页查询

修改完代码 进行发布 还是依然fullgc

23:30 突然发现启动参数 配置的内存是2G,于是乎修改成6g ,心想一定是这个地方内存小了导致的

 修改完之后进行发布,发现fullgc频率低了很大但是依然存在fullgc问题

12:00 开始进行dump文件下载分析

jmap -dump:format=b,file=/tmp/heapDump.hprof pid 

00:50 dump文件下载完成,开始进行正式分析,利用mat工具对dump文件进行分析

分析Leak Supercts视图 发现代码确定存在很大的问题

 选择一个地址进行具体分析

 当前具体的堆内存信息

 

内存对应的详细信息

简单介绍一下这里的MySQL JDBC内存信息

<class>代表类相关的信息

catalog:mysql 目录 类似schema 

connection:对应数据库连接信息 记录用户名 密码 url  连接数等数据库连接的配置

owningStatement:对应JDBC42PreparedStatement 记录预编译语句相关

field:对应查询的字段

columnLabelToIndex:对应查询列的索引

rowData:对应列的数据

找出内存泄露的地方 那我们怎么定位到是SQL语句呢?

科普一下,在SQL语句执行的流程中我们都知道 SQL语句一般都会进行预编译 与之对应的JDBC功能都是Statement语句 所以我们找到内存中带有Statement的内存信息 如下图

在这个图中 我们惊喜的发现了新大陆 originalSql 这个就是保存原始未解析之前的SQL信息


 根据有问题的SQL在到代码中反查,确实发现了这段代码

没有走索引而且一次性查询的数据量非常大

导致fullgc的原因是这样的

故事还得从这个接口的作用说起,此接口是提供给监控服务使用,每完成一单主动交易,监控服务就会调用此接口校验是否需要查询可用库存,随着iat_task_detail表数据库越来越大30W+,任务执行速度越来越快,导致内存中堆积大量查询结果,大对象直接进入老年代,不会进行yong gc,大量请求直接导致老年代瞬间达到fullGC条件,就会执行fullGC,然后任务还在继续,就会导致fullGC释放之后,很短时间有达到fullGC条件,会继续fullGC,不断循环往复, 这就是cat监控短时间内有大量fullGC问题的根源

知道了问题根因,那我们如何解决呢?

解决办法就很简单了,针对本次单层货权,不需要查询此SQL 直接返回true,就行了,是不是很简单

03:10 修改完代码重写发布,fullgc问题解决了,监控了一个小时发现正常了 

04:00 回家 睡觉了。。。。

思考总结:针对fullgc问题 我们还是的根据dump文件对代码进行分析才行,一定要动手实践,所谓的高手就是跨过坑和大海

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记一次线上fullgc排查历程 的相关文章

随机推荐

  • VQ-VAE

    Generating Diverse High Fidelity Images with VQ VAE 2 摘要 本文主要研究VQ VAE在大尺度图像生成器上的应用 我们改进了自回归的先验来生成比以前更加优秀的图片 本文使用的是简单的编码和
  • springbboot的默认缓存方案:@Cacheable@CachePut@CacheEvict

    Spring Boot 默认使用的缓存方案是基于 Spring Framework 的缓存抽象 在 Spring Boot 中 你可以使用 Cacheable CachePut 和 CacheEvict 注解来实现缓存功能 Cacheabl
  • Bugkuctf--逆向第三题游戏过关题解

    题目链接 https ctf bugku com challenges 先让我们来打开文件 既然题目都说是游戏过关了 那就玩玩这个游戏呗 雾 游戏还是很简单的 但显然这道题应该用逆向的思维来做 废话 正式部分 逆向的题拿到手一般能考虑的工具
  • 行走在前端路上

    从今天起开始写一写实际项目中遇到的各种前端问题 希望对自己和和小伙伴们都能起到一定的帮助作用
  • 架构师必须了解的 5 种最佳软件架构模式

    世界变得越来越依赖软件 软件系统已经渗透到了人类生活的方方面面 并带来了很多便利 从移动应用 用于和人联系 到医疗应用和深度学习模型 到金融技术系统 再到智能建筑 利用技术来自动化许多功能 为了提供所需的解决方案并获得最佳效果 必须使用恰当
  • Qt 疑云解答

    一 qt的mianwindow处不能布局 我们在mainwindow中添加2个控件 pushButton和pushButton 2 QWidget centerWindow new QWidget this this is point to
  • Hashmap扩容方法机制原理

    Hashmap扩容方法 机制原理 1 7版本 数组额定容量为16 元素数量超过负载因子 一般为0 75 后会扩容至原有数组大小 2 遍历老数组每个位置上的链表每个元素 取每个元素的key根据链表长度计算出在新数组中的下表 将元素添加到新数组
  • SylixOS下Redis编程实践

    1 Redis简介 Redis是一个完全开源的key value型数据库 其显著特点是基于内存操作 但是可以持久化到磁盘 相比较其他的数据库 Redis有着明显的优势 响应速度快和特性丰富是其明显的特点 其他的特点这里不一一赘述 Redis
  • pytorch 的 dataset 中使用 onnxruntime

    如果在 dataset 中预处理图像时 用到了 onnxruntime 的 cudaep 出现这样的错误 1 2022 12 13 13 53 01 554864883 E onnxruntime Default cuda call cc
  • Vuepress 导航栏与侧边栏配置详解

    目录 一 目录结构 二 导航栏配置 三 侧边栏配置 四 效果图 图 1 图 2 图 3 图 4 一 目录结构 这是我创建的 vuepress 站点 可参考 https blog csdn net sinat 31213021 article
  • windows下如何安装git以及IDEA如何配置git

    一 安装git git官方下载地址Git Downloads 目前最新的版本是2 15 0 1 1 首先 双击安装包 打开安装界面 然后点击Next下一步 1 2 配置git的安装组件 默认就行 继续点击Next下一步 默认勾选的内容有 创
  • http实现文件分片下载

    文章目录 检测是否支持 HTTP Range 语法 Range请求cURL示例 单一范围 多重范围 条件式分片请求 Range分片请求的响应 文件整体下载 文件分片下载 文本下载 图片下载 封装下载方法 HTTP分片异步下载是一种下载文件的
  • GBDT&GBRT与XGBoost

    在看清华学霸版 Python大战机器学习 的过程中 集成学习章节中出现了两个新的名词 GBDT GBRT 也许是西瓜书定位于全面 而没有拘泥于细节 后来科普发现 这两个东西和陈天奇大神的XGBoost紧密相连 于是估摸着花时间弄懂这两个东西
  • 【算法日志】动态规划刷题:股票买卖附加问题(day42)

    代码随想录刷题60Day 目录 前言 含冷冻期的股票买卖最佳时期 含手续费的股票买卖最佳时期 前言 今天的股票买卖问题会附加一些条件 但总体难度不大 含冷冻期的股票买卖最佳时期 该问题难点在于对几个状态进行解构并写出相应的状态转移方程 in
  • 安卓各文件存储路径汇总(Android file path)

    写下来 省得以后不记得到处翻 Environment getDataDirectory data Environment getDownloadCacheDirectory cache Environment getExternalStor
  • 2017 ICM/MCM Problem E: Sustainable Cities Needed!

    题目理解可持续发展的城市 任务 References 题目理解 可持续发展的城市 许多社区正在实施智能增长计划 以考虑长期 可持续的规划目标 聪明的成长是关于帮助每个城镇和城市变成更加经济繁荣 社会公平和环境可持续的生活地方的意思 2 智能
  • STM32使用HAL库输出连续可调的PWM信号

    项目中要控制一个步进电机控制器 因为涉及到加减速过程 需要频率任意可变 总体思路是先初始化PWM定时器输出 之后直接修改ARR和PSC寄存器 初始化代码如下 函 数 名 bsp SetTIMOutPWM 功能说明 设置引脚输出的PWM信号的
  • PHP正则采集示例 sscanf

    sscanf从一个格式化字符串中读取输入 功能跟正则类似 输出结果 Age 25 Name John Gender male 正则三段论 定
  • Mycat+Mysql分布式架构改造和性能压力测试

    架构实现 Mycat作为数据库高可用中间件具备很多的功能 如负载均衡 分库分表 读写分离 故障迁移等 结合项目的实际情况 分库分表功能对于关联查询有很高的要求 需要从业务角度考虑分库分表后的关联查询SQL的分析 业务代码动作较大 所以在此方
  • 记一次线上fullgc排查历程

    在公司一次重大项目中 生产环境突然发生频繁fullgc问题 通过cat发出警告 很不幸 这次项目非常重要 领导很看重 所以得赶紧解决问题 下面就是排查的艰苦历程 22 10 线上可以报警 出现fullgc问题 初步判断是服务器少了 于是申请