一次OOM事故的学习过程
事故过程
周二下午得到消息, 希望帮忙分析dump文件.
告知dump大小为42G大小. 一般机器没这么大的内存进行处理.
建议现场上传到百度云盘, 然后我这边进行下载.
时间进度为:
11.57创建的dump
现场打包压缩, 拉取上传百度云盘. 速度大概只有500KB/S.
压缩后文件6G, 时间大约是 4小时左右上传完.
我这边接收到百度云盘已经晚上七点半.
下载耗时大约1h+
九点开始解析, 九点五十五分出结果.
分析情况:
机器内存 96G 16vCPU
mat使用56G内存作为堆区分析dump文件
分析42G的dump文件, 分析结果堆区为27.5G,最大的一个现场使用23.3G的内存.
分析耗时 50min.
OOM的一些分析
dump解析完成只有
在overview 的截面处明显看到有一个巨大的内存对象.
左键最大的内存区域 打开java-basic 然后可以查看thread details
可以看到占用最大内存的区域是什么进程在使用.
因为mat 较为卡顿, 建议将整个堆栈区域复制出来进行分析.
排除掉springboot java 以及类加载器相关的堆栈, 基本上就可以定位到是那一块业务代码
然后根据模块信息找到具体开发, 然后进一步存在具体的业务功能.
针对分析出来的业务功能去查看业务逻辑以及SQL等内容.
OOM的一些分析
注意 OOM 分析的时间跟CPU有关系也跟内存大小和磁盘IO性能有关系.
他分析过程中会形成大量的文件, 作为索引, 如果出现了停止响应, 可以杀掉进程
重新打开待分析的dump文件. 速度会比较快.
分析完threads 之后 可以分析一下 dominator_tree 里面会有响应的堆区内存的详细信息.
需要按照retained heap 的大小进行排序, 打开最大占用内存的线程信息就可以.
一直选中占用内存最大对想进行展开.
我这次例子中 hashmap的对象下面有多个hashmapnode
简单统计了下:
没一个hashmap对象占用 3KB左右的内存空间. 一共先是有800多万个对象. 简单计算为:
3KB*8M=24GB. 很明显就可以将内存使用情况计算出来.
然后继续打开每一个 hashmapnode
发现第一个node的数值都是一样的, 将数据取出.放入第一步业务开发分析出来的SQL.
验证查询展示出来的数据结果集是否是八百万多.
优化的方向
JVM的堆区和GC类型的设置还是需要关注
bean数量的差异,以及实例化对象多寡对内存的要求是不一样的.
堆区,栈区,方法区,以及元数据区,还有直接内存还有系统自己剩余的内存
必须严格控制, 建议关闭swap, 避免swap出现时磁盘读写降低系统性能.
建议服务器必须专用 堆区还是足够大比较好,
足够大的堆区能够容忍部分垃圾代码, 和降低异常产生的频率和次数.
不能因为OOM时dump文件过大就因噎废食. 可以通过改善工具的方式来解决问题
而不是为了好解决问题和不顾及问题发生的频率.
分析优化
突然想这次OOM 可能不全通过dump分析应该也可以定位到.
猜测一下分析方式:
top -Hp threadid 查看占用CPU最多的进程信息
然后jstack -l 将堆栈信息打出
查看堆栈详细内容. 进行排查.
理论上效率应该能快很多.
另外建议现场有高配置的机器. 能够直接分析dump
没有人能够靠眼睛分析出来所有的问题. 必须有趁手的兵器才可以.
优化的方向
left join左连接产生的是笛卡尔积,
即两个10行的表左连接,首先是生成一个10*10行的表,
然后根据on后面的条件筛选符合条件的行。
消除笛卡尔乘积最根本的原因不是在于连接,而是在于唯一ID,
就像学号,一个学生就只有一个学号,学号就是这个学生的唯一标识码。
左连接只是以左边的表为基准,左边的ID和右边ID都是唯一,
就不会产生笛卡尔现象,如果右边有两个ID对应左边一个ID,
就算你是左连接,一样会产生1对多的现象。
SQL连接的简单学习

代码排查方面
简单数据的情况下不会有这样的问题.
但是如果连接的 关联条件查询出来的数据不唯一
会导致笛卡尔积,比两个表的数量都放大.
业务SQL的严格准确很重要, 一定不要有笛卡尔积的结果出现.
本次例子里面两个子表 在同一个条件下 各有 2932条数据.
简单的笛卡尔积 就导致了接近 9m 的数据量.
因为查询的结果集字段比较多, 导致一次查询就会使用 24GB的堆区
直接导致OOM
一次OOM事故的学习过程的更多相关文章
- 公司内部一次关于OOM故障复盘分享
最近笔者有点忙,这次OOM事故发生过去两周前,记得笔者那天正带着家人在外地玩,正中午跟友人吃饭的时候,钉钉连续告警爆表,接着就是钉钉电话(显示广东抬头)一看就知道BBQ了,又一次故障发生了,今天把那次 ...
- 生产事故-记一次特殊的OOM排查
入职多年,面对生产环境,尽管都是小心翼翼,慎之又慎,还是难免捅出篓子.轻则满头大汗,面红耳赤.重则系统停摆,损失资金.每一个生产事故的背后,都是宝贵的经验和教训,都是项目成员的血泪史.为了更好地防范和 ...
- JVM OOM异常会导致JVM退出吗?
出处: https://mp.weixin.qq.com/s/8j8YTcr2qhVActLGzOqe7Q https://blog.csdn.net/h2604396739/article/de ...
- 2019年IT事故盘点【IT必读】
昀哥@老兵笔记 2020农历新年开局不容易,新冠肺炎仍在攻艰克难阶段.回首过去的9102年,总有一些事主要是事故值得去记录.下面我们来盘点一下9102年的“外部事故”. 一,我们遭遇的IT基础设施服务 ...
- 2万字|30张图带你领略glibc内存管理精髓(因为OOM导致了上千万损失)
前言 大家好,我是雨乐. 5年前,在上家公司的时候,因为进程OOM造成了上千万的损失,当时用了一个月的时间来分析glibc源码,最终将问题彻底解决. 最近在逛知乎的时候,发现不少人有对malloc/f ...
- 紧张 + 刺激,源自一次 OOM 历险
作者 | 蚂蝗 背景 Erda 是集 DevOps.微服务治理.多云管理以及快数据管理等多功能的开源一站式企业数字化平台.其中,在 DevOps 模块中,不仅有 CI/CD.项目协同等功能,同时还 ...
- 火山引擎MARS-APM Plus x 飞书 |降低线上OOM,提高App性能稳定性
通过使用火山引擎MARS-APM Plus的memory graph功能,飞书研发团队有效分析定位问题线上case多达30例,线上OOM率降低到了0.8‰,降幅达到60%.大幅提升了用户体验,为飞书的 ...
- 【知识必备】内存泄漏全解析,从此拒绝ANR,让OOM远离你的身边,跟内存泄漏say byebye
一.写在前面 对于C++来说,内存泄漏就是new出来的对象没有delete,俗称野指针:而对于java来说,就是new出来的Object放在Heap上无法被GC回收:而这里就把我之前的一篇内存泄漏的总 ...
- ValueInjecter----最好用的OOM(以微信消息转对象举例)
使用数据实体的好处我这里就不多说了,但大家享受这些好处的时候,难免也对那些琐碎的赋值代码感到厌烦,基于此,我认为掌握一个oom的使用,还是很有必要的. 这种类型的工具有很多,比如automapper, ...
- 五步掌握OOM框架AutoMapper基本使用
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址 www.cnblogs.com/tdws 写在前面 OOM顾名思义,Object-Object-Mapping实体间相互转换,Aut ...
随机推荐
- ModelBox姿态匹配:抖抖手动动脚勤做深呼吸
摘要:本案例使用Windows版本的ModelBox SDK进行二次开发,主要是针对姿态匹配案例开发实践. 本文分享自华为云社区<姿态匹配:抖抖手动动脚勤做深呼吸>,作者:吴小鱼. 在之前 ...
- 一文带你认识AscendCL
摘要:AscendCL(Ascend Computing Language,昇腾计算语言)是昇腾计算开放编程框架,是对底层昇腾计算服务接口的封装. 本文分享自华为云社区<[CANN文档速递09期 ...
- MySQL 数据库救火:磁盘爆满了,怎么办?
摘要:当磁盘空间爆满后,MySQL会发生什么事呢?又应该怎么应对? 本文分享自华为云社区<[MySQL 数据库救火]- 磁盘突然爆满的处理方式>,原文作者:技术火炬手 . 大多数用户在对于 ...
- C++多线程强制终止
摘要:实际上,没有任何语言或操作系统可以为你提供异步突然终止线程的便利,且不会警告你不要使用它们. 本文分享自华为云社区<如何编写高效.优雅.可信代码系列(1)--C++多线程强制终止>, ...
- 列存Delta表是个什么东东
摘要:本文从delta表的概念.来历.用法.开启后的影响,delta表数据转移到主表几个方面做了详细的介绍. 本文分享自华为云社区<GaussDB(DWS) 列存delta表的简单介绍>, ...
- 用 Java?就用国产轻量框架: Solon v1.10.2
相对于 Spring Boot 和 Spring Cloud 的项目: 启动快 5 - 10 倍. (更快) qps 高 2- 3 倍. (更高) 运行时内存节省 1/3 ~ 1/2. (更少) 打包 ...
- Jenkins Pipeline SSH Publisher 环境变量、参数引用 要用双引号
Jenkins Pipeline SSH Publisher 环境变量.参数引用 要用双引号 在 Pipeline 脚本中,如果要使用变量,就必须使用 " 双引号 pipeline { ag ...
- 国内加速访问Github的办法
说明 自从GitHub私有库免费后,又涌入了一大批开发爱好者. 但国内访问GitHub的速度实在是慢得一匹,在clone仓库时甚至只有10k以下的速度,大大影响了程序员的交友效率. 国内加速访问Git ...
- 【JAVA基础】MySQL配置
mySQL配置 数据库连接 初始化配置 --创建用户 并授权 create user 'injasup'@'%' identified by 'supplier@2023#!'; GRANT SELE ...
- UVA - 1594 :Ducci Sequence (set应用)
给定n元组(a1,a2,...,an),ai均为整数,得到下一个序列为(|a1-a2|,|a2-a3|,...,|an-a1|),如此循环下去,必定会出现全零序列或重复序列. 现要求判断给定序列是全零 ...