一次异常OOM问题学习跟踪的过程
摘要
春节后第一周一个项目出现了OOM的问题.
平台研发和产品研发跟踪了接近一周的时间也没有最终确认问题根因.
这里总结一下整个过程, 希望以后在遇到相同问题时会有进一步的结论.
产品的稳定运行离不开所有人的努力. 不管是框架,产品平台还是其他.
现象和暂时的结论
产品需要在月初处理一个月度数据.
但是最近发现处理过程非常缓慢,并且经常无法处理完成.
并且会导致处理数据的服务器卡顿.CPU暴高.出现响应变慢的问题.
后台进行了mat的分析工作. 然后发现有一个可以的memory leak
但是比较奇怪的是 他的对象名为 hibernate的queryplancache里面包含了 完全相同的 接近3000个表的信息
每一个里面有 11k 这么大,并且对象有 接近200万个, 直接导致 占用了 20G的对内存.
导致异常.
根据平台开发的分析. 发现此处可能为hibernate的bug:
理论上默认值 hibernate 的 queryplancache 最多占用2G的内存, 但是实际上占用了20G.
应该是业务的代码触发了hibernate的bug导致缓存信息放到内存中没有释放,出现了OOM.
分析过程
获取返回过来的 dump 文件, 使用 mat 进行简要分析
打开 leak suspect 进行查看
建议可以先查看 系统的概要信息对系统有一个简单的了解:
Leak Suspects
» System Overview
System Overview
Heap Dump Overview
System Properties
Thread Overview
Top Consumers
Class Histogram
打开 Problem Suspect 1
理论上第一个问题的概率最高
建议选中detail 打开详细进行查看.
在memory leak的界面可以看到很多内容.
The thread org.apache.tomcat.util.threads.TaskThread @ 0x5e901df80 http-nio-5200-exec-2
keeps local variables with total size 6,885,096,656 (66.41%) bytes.
此命令会将 占用最多内存的堆栈信息展示出来. 存在未的风险是最大的.
Shortest Paths To the Accumulation Point
累积点的最短路径
Accumulated Objects in Dominator Tree
累积对象所在树
Accumulated Objects by Class in Dominator Tree
对象树种按照类进行分组的对象信息
All Accumulated Objects by Class
按照类进行分组的所有的对象信息
Thread Details
线程信息
Thread http-nio-5200-exec-2
Thread Properties
Thread Stack
线程堆栈信息
最快分析方法
打开最后面的 Thread Details -> Thread Stack
可以反馈给对应开发. 确认问题场景等.
打开 All Accumulated Objects by Class
可以查看哪些对象 占用内存最多
可以通过这个内容 确定上一个场景里面的业务数据, 便于研发人员进一步的定位问题原因.
发现精确的数据, 比如发现excel的文件信息. 发现异常的用户id等.
打开 Accumulated Objects by Class in Dominator Tree
或者是上面一个 可以看到对象的上下级信息, 便于分析是那一块的问题
可以快速发现是否是产品bug或者是比较深层次的问题.
关于 in going 以及out going 等名词的含义
in going: 查看对象被谁引用,右键->list objects -> with ingoing references
out going: 查看对象为什么耗内存,我们看到一个线程池占用了>25mb的内存,右
键->list objects -> with outgoing references
Shallow Size: 对象自身占用的内存大小,不包括它引用的对象
Retained Size:被GC后Heap上释放的内存大小,
即当前对象大小+当前对象可直接或间接引用到的对象的大小总和
一次异常OOM问题学习跟踪的过程的更多相关文章
- C++异常中的堆栈跟踪
C++语言的运行时环境是基于栈的环境,堆栈跟踪(trace stack)就是程序运行时能够跟踪并打印所调用的函数.变量及返回地址等,C++异常中的堆栈跟踪就是当程序抛出异常时,能够把导致抛出异常的语句 ...
- OutOfMemory相关问题(内存溢出异常OOM)
OutOfMemory(内存溢出异常OOM) java.lang.OutOfMemoryError :Thrown when the Java Virtual Machine cannot alloc ...
- JVM学习笔记——类加载过程
JVM学习笔记——类加载过程 类加载模型——双亲委派模型(Parents Delegation Model)也可称为“溯源委派加载模型” Java的类加载器是一个运行时核心基础设施模块,主要是启动之初 ...
- Java虚拟机JVM学习03 连接过程:验证、准备、解析
Java虚拟机JVM学习03 连接过程:验证.准备.解析 类被加载后,就进入连接阶段. 连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去. 连接阶段三个步骤:验证.准备和解析. 类 ...
- (二)我的Makefile学习冲动&&编译过程概述
前言 一 年轻的冲动 二 学习曲线 1 Makefile基本语法 2 bash基础 3 world 三 编译过程概述 1 主机预装工具 2 编译host工具 3 编译交叉工具链 4 编译内核模块 5 ...
- Linux内核分析第一周学习博客 --- 通过反汇编方式学习计算机工作过程
Linux内核分析第一周学习博客 通过反汇编方式学习计算机工作过程 总结: 通过这次对一个简单C程序的反汇编学习,我了解到计算机在实际工作工程中要涉及大量的跳转指针操作.计算机通常是顺序执行一条一条的 ...
- SQLNET跟踪tnsping过程
原文地址:SQLNET跟踪tnsping过程 作者:yingyifeng306 sqlnet是oracle提供的与网络层面交互的一个工具,比如如何解析客户端发起的连接,如何对客户端发起的连接进行辨别, ...
- Java学习的一般过程
伴随着科学技术的不断发展,世界开始走向信息化.网络化.大数据化.自然而然,计算机专业变得十分热门.尽管如此,计算机专业人才对社会来说仍然是供不应求,当然,这里指的是高层次技术人才.因此,对于我们这些占 ...
- 在学习python的过程中,遇到的最大的困难是什么?
本人文科生,回顾自己近 2 年的Python 自学经历,有一些学习心得和避坑经验分享给大家,让大家在学习 Python 的过程中少走一些弯路!减少遇到不必要的学习困难! 首先,最开始最大的困难应该就是 ...
- [持续更新] Python学习、使用过程中遇见的非代码层面知识(想不到更好的标题了 T_T)
写在前面: 这篇博文记录的不是python代码.数据结构.算法相关的内容,而是在学习.使用过程中遇见的一些没有技术含量,但有时很令人抓耳挠腮的小东西.比如:python内置库怎么看.python搜索模 ...
随机推荐
- 【scikit-learn基础】--『监督学习』之 贝叶斯分类
贝叶斯分类是一种统计学分类方法,基于贝叶斯定理,对给定的数据集进行分类.它的历史可以追溯到18世纪,当时英国统计学家托马斯·贝叶斯发展了贝叶斯定理,这个定理为统计决策提供了理论基础. 不过,贝叶斯分类 ...
- [极客大挑战 2019]Havefun 1
[极客大挑战 2019]Havefun 1 一,审题,观察题目信息和知识点 观察题目,没发现有效信息 F12打开源代码,发现有一个GET传输. 知识点 GET方法的数据传输是通过URL传输的, ...
- 华为云推出全自研数据库,GaussDB(openGauss)能否撑起一片天?
摘要:GaussDB(openGauss) 基于华为云底座,能够快速全球化部署,同时支持用户的本地化部署诉求,跟云上生态工具紧密结合让用户在迁移.开发.运维上省时省心. GaussDB(openGau ...
- 数仓实践丨主动预防-DWS关键工具安装确认
摘要:gdb确认是否安装,所带来的该工具用户数据库实例触发core问题后集群状态反复异常,对此问题及时分析根因并及时进行规避. 本文分享自华为云社区<主动预防-DWS关键工具安装确认>,作 ...
- 动手实践丨基于ModelAtrs使用A2C算法制作登月器着陆小游戏
摘要:在本案例中,我们将展示如何基于A2C算法,训练一个LunarLander小游戏. 本文分享自华为云社区<使用A2C算法控制登月器着陆>,作者:HWCloudAI . LunarLan ...
- 全文手敲代码,教你用Java实现扫雷小游戏
摘要:本程序共封装了五个类,分别是主类GameWin类,绘制底层地图和绘制顶层地图的类MapBottom类和MapTop类,绘制底层数字的类BottomNum类,以及初始化地雷的BottomRay类和 ...
- 理论+实例,带你掌握Linux的页目录和页表
摘要:操作系统在加载用户程序的时候,不仅仅需要分配物理内存,来存放程序的内容:而且还需要分配物理内存,用来保存程序的页目录和页表. 本文分享自华为云社区<Linux从头学15:[页目录和页表]- ...
- 【scikit-learn基础】--『监督学习』之 层次聚类
层次聚类算法是机器学习中常用的一种无监督学习算法,它用于将数据分为多个类别或层次.该方法在计算机科学.生物学.社会学等多个领域都有广泛应用. 层次聚类算法的历史可以追溯到上世纪60年代,当时它主要被用 ...
- .NET Core 在其上下文中,该请求的地址无效。
.NET Core 在其上下文中,该请求的地址无效. 看了端口,发现没被占用,后来发现是IP地址变了 改成正确的IP就可以了.
- 【django-vue】 项目上线 uuid重复问题 内网穿透 支付宝验签 nginx集群 远程连接redis 使用uwsgi启动django
目录 上节回顾 uuid重复问题 内网穿透 支付宝验签 今日内容 1 上线架构图 2 阿里云购买 3 安装git和其他依赖 4 云服务器安装mysql 5 云服务器安装redis(源码安装) 远程连接 ...