文档章节

一次线上OOM故障排查经过

黄亿华
 黄亿华
发布于 2014/03/05 10:02
字数 752
阅读 4626
收藏 138
点赞 13
评论 30
JVM

本文是一次线上OOM故障排查的经过,内容比较基础但是真实,主要是记录一下,没有OOM排查经验的同学也可以参考。

现象

我们之前有一个计算作业。最近经常出现不稳定,无法正常响应的情况。具体表现是:各种连接超时,从mysql、mongodb和zookeeper到netty,能超时的都超时过了。其他看不到太多有效的异常。

所以我们首先怀疑的是网络问题,打电话跟运维确认,运维说网络问题的可能性几乎为0,因为我们的机器是虚机,宿主机上的其他设备都运转正常。程序问题的可能性更大。继续从应用日志和tomcat的catalina.out中查找日志,发现有一些OutOfMemoryError异常。实际上,出现这个异常就代表内存不够了。

我们使用cat(公司的Java监控平台,已开源https://github.com/dianping/cat)查看堆使用的情况,看到如下的东西:

cat oom

Memory Free已经接近了0,同时产生了大量的fullgc。

回到之前的连接timeout,我们知道,Java的连接timeout,除了网络传输的时间,也包括了Java程序处理的时间,所以OOM导致timeout也不奇怪了。

工具和排查

之前JVM分析做的很少,在同事的帮助下,结合一点资料,完成了基本的分析。

首先可用的是

jmap -histo PID

这个命令会将内存中最终保存的对象列出来。

jmap-histo

其中"["表示数组,例如"[B"是byte[],具体可以看Class.getName()的Javadoc。

但是这个只能粗略定位原因,如果要仔细分析,需要知道是哪些个对象持有了它,这个时候,就需要dump内存下来,再离线分析了。

dump内存的命令是:

jmap -dump:format=b,file=/home/admin/dump.bin PID

此操作异常耗时,我跟运维在假死的机器上尝试了几次,竟然把tomcat进程干掉了,使用时还是小心为妙…跟同事讨论,认为jmap -dump实际上也是往运行的JVM实例发送一个dump请求,所以如果实例内存不足,dump很可能会失败。比较好的做法是先降低一部分负载(比如把线上的机器先切下线)再试。

我这里使用VisualVM进行分析,大致效果如下:

visual-vm

这里选择“计算保留大小”。这个保留大小是递归计算实例之间的依赖,得到的总大小。因为去掉了循环依赖,所以并不完全准确,但是用于排查够了。选择保留大小最大的实例,一般就是罪魁祸首了!

visual-vm2

最后排查出的结果,是公司的RPC中间件使用了ThreadLocal来保存一个context,但是最后却没有释放。按照架构组的说明,升级了版本,问题解决!

© 著作权归作者所有

共有 人打赏支持
黄亿华

黄亿华

粉丝 2290
博文 131
码字总数 116344
作品 7
程序员
加载中

评论(30)

cheeeeeeeeeeen
cheeeeeeeeeeen
Threadlocal不是会自动释放吗?
黄亿华
黄亿华

引用来自“唯一only”的评论

博主,从计算保留大小开始有点看不懂,能不能讲仔细点。谢谢

计算保留大小是VisualVM的一个功能,这么说很难说清楚,建议操作一下就理解了
唯一only
唯一only
博主,从计算保留大小开始有点看不懂,能不能讲仔细点。谢谢
james_you
james_you

引用来自“黄亿华”的评论

引用来自“sharkbobo”的评论

你截出来的图,并不能说明你说的问题,可能你没有用真实的图,其实发这种图,没有什么商业机密啊

其实本文主要是说明一下方法,故障原因有很多种类,列举出来也没啥意义。

呵呵,好吧。其实排查oom也就是这样
黄亿华
黄亿华

引用来自“sharkbobo”的评论

你截出来的图,并不能说明你说的问题,可能你没有用真实的图,其实发这种图,没有什么商业机密啊

其实本文主要是说明一下方法,故障原因有很多种类,列举出来也没啥意义。
james_you
james_you
你截出来的图,并不能说明你说的问题,可能你没有用真实的图,其实发这种图,没有什么商业机密啊
james_you
james_you
你截出来的图,并不能说明你说的问题,可能你没有用真实的图,其实发这种图,没有什么商业机密啊
james_you
james_you
你截出来的图,并不能说明你说的问题,可能你没有用真实的图,其实发这种图,没有什么商业机密啊
品不懂
品不懂
mark 学习了
wxpier
wxpier

引用来自“黄亿华”的评论

引用来自“wxpier”的评论

实际试了一下,发现一个问题,第一个jvvm图中没有【保留】这一列,第二个jvvm图中出现了这一列,我用jdk1.7中的jvvm测试,发现并没有这一列,选择隐藏和显示列按钮,也没有,请问,需要安装插件吗?

我是点击到“实例”tab,出现“计算保留数”之后,切换回来出现的这一列。

不知道你用的哪个VVM,其实呢,jvvm中没有这一列,只有在vvm中才有,直接在隐藏和显示列按钮中选择就可以了
CPU100%问题快速定位思路

在我日常运维工作中,无论自己 或同事、朋友总会问我,服务器CPU使用率100%,卡死了,这样的话,那今天咱们就一起模拟故障,进行细致的分析,首先介绍下,CPU出现问题的几种原因: 一、CPU 1...

邱月涛
06/04
0
0
SpringCloud学习之sleuth&zipkin

一。调用链跟踪的必要性   首先我们简单来看一下下单到支付的过程,别的不多说,在业务复杂的时候往往服务会一层接一层的调用,当某一服务环节出现响应缓慢时会影响整个服务的响应速度,由...

java~nick
03/21
0
0
jvm优化必知系列——监控工具

这是jvm优化系列第二篇: jvm优化——垃圾回收 通过上一篇的jvm垃圾回收知识,我们了解了jvm对内存分配以及垃圾回收是怎么来处理的。理论是指导实践的工具,有了理论指导,定位问题的时候,知...

wier
2017/10/18
0
0
一次OOM的排查过程

最近测试环境的Java应用经常挂掉,用jconsole查看堆内存使用情况,如下图: 在达到高峰的时候tomcat服务挂了,看图可以知道使用内存过大,于是开始追踪元凶。 加入启动参数 在catalina.sh加入...

耀子
2016/07/12
48
0
jvm优化必知系列——监控工具

这是jvm优化系列第二篇: jvm优化——垃圾回收 通过上一篇的jvm垃圾回收知识,我们了解了jvm对内存分配以及垃圾回收是怎么来处理的。理论是指导实践的工具,有了理论指导,定位问题的时候,知...

wier
2017/10/18
0
14
Protobuf使用不当导致的程序内存上涨问题

protocol buffers[1]是google提供的一种将结构化数据进行序列化和反序列化的方法,其优点是语言中立,平台中立,可扩展性好,目前在google内部大量用于数据存储,通讯协议等方面。PB在功能上...

百度MTC
2016/01/11
92
0
程序员应该知道的“分布式链路追踪”

微信公众号:程序员大会 随着去中⼼化思想的流行,越来越多的系统正在从大规模整体式架构向着分布式微服务架构迁移,服务之间的相互调⽤⽇益复杂。如何保证系统的可观测性,快速发现系统性能瓶颈...

程序员大会
01/12
0
0
线上问题处理方案

接到线上问题应该如何去做 处理线上问题第一原则:先保障线上服务可用性,第一时间降低故障影响范围。 机动人员处理问题流程: 第一时间在问题群内同步自己开始跟进问题 评估问题影响范围,确...

美团点评点餐
2017/12/18
0
0
线上应用故障排查之二:高内存占用

上一篇介绍了线上应用故障排查之一:高CPU占用,这篇主要分析高内存占用故障的排查。 搞Java开发的,经常会碰到下面两种异常: 1、java.lang.OutOfMemoryError: PermGen space 2、java.lang...

有事没事
2015/12/06
131
0
CPU 100% 异常排查实践与总结

CPU 100% 异常排查实践与总结 leejun2005的个人页面2018-01-041 阅读 java 1、问题背景 昨天下午突然收到运维邮件报警,显示数据平台服务器cpu利用率达到了98.94%,而且最近一段时间一直持续...

leejun_2005的个人页面
01/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
2
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
1
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
156
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部