线上问题定位--OOM
服务器上部署了Java服务,出现了OutOfMemoryError,问题应该如何定位?
解决思路
Java服务OOM,最常见的原因为:
有可能是内存分配确实过小,而正常业务使用了大量内存
某一个对象被频繁申请,却没有释放,内存不断泄漏,导致内存耗尽
某一个资源被频繁申请,系统资源耗尽,例如:不断创建线程,不断发起网络连接
更具体的,可以使用以下的一些工具逐一排查。
一、查发生了OOM的进程
工具:top
方法:
执行top -d 1 -c,每秒刷新一次,显示进程运行信息列表
键入M (大写m),进程按照内存使用排序
图示:
二、确认是不是内存本身就分配过小
方法:jmap -heap 2820
如上图,可以查看新生代,老生代堆内存的分配大小以及使用情况,看是否本身分配过小。
三、找到最耗内存的对象
方法:jmap -histo:live 2820 | more
图示:
如上图,输入命令后,会以表格的形式显示存活对象的信息,并按照所占内存大小排序:
实例数
所占内存大小
类名
是不是很直观?对于实例数较多,占用内存大小较多的实例/类,相关的代码就要针对性review了。
上图中占内存最多的对象是byte,共占用内存71M,值得关注,后续再MAT中再次分析。
四、确认是否是资源耗尽
查看进程创建的线程数,如果资源耗尽,也可能出现OOM。
工具:
ps
方法:ps -efL 2820
查看进程网络连接数,如果资源耗尽,也可能出现OOM。
工具:
netstat
方法:netstat -apn | grep 2820
这里介绍另一种方法,通过
/proc/${PID}/fd
/proc/${PID}/task
可以分别查看句柄详情和线程数。
例如,某一台线上服务器的sshd进程PID是2820,查看
ll /proc/2820/fd
ll /proc/2820/task
喜欢请微信扫描下面二维码,关注我公众号--“扯一扯技术”,做一些实战项目中的问题和解决方案分享。

线上问题定位--OOM的更多相关文章
- 线上服务内存OOM问题定位[转自58沈剑]
相信大家都有感触,线上服务内存OOM的问题,是最难定位的问题,不过归根结底,最常见的原因: 本身资源不够 申请的太多 资源耗尽 58到家架构部,运维部,58速运技术部联合进行了一次线上服务内存OOM问 ...
- 线上服务内存OOM问题定位
转自:架构师之路,http://mp.weixin.qq.com/s/iOC1fiKDItn3QY5abWIelg 相信大家都有感触,线上服务内存OOM的问题,是最难定位的问题,不过归根结底,最常见的 ...
- 线上服务内存OOM问题定位三板斧
相信大家都有感触,线上服务内存OOM的问题,是最难定位的问题,不过归根结底,最常见的原因: 本身资源不够 申请的太多 资源耗尽 58到家架构部,运维部,58速运技术部联合进行了一次线上服务内存OOM问 ...
- 糟了,线上服务出现OOM了
前言 前一段时间,公司同事的一个线上服务OOM的问题,我觉得挺有意思的,在这里跟大家一起分享一下. 我当时其实也参与了一部分问题的定位. 1 案发现场 他们有个mq消费者服务,在某一天下午,出现OOM ...
- Arthas - Java 线上问题定位处理的终极利器
前言 在使用 Arthas 之前,当遇到 Java 线上问题时,如 CPU 飙升.负载突高.内存溢出等问题,你需要查命令,查网络,然后 jps.jstack.jmap.jhat.jstat.hprof ...
- 线上BUG定位神器(阿尔萨斯)-Arthas2019-0801
1.下载这个jar 2.运行这个jar 3.选取你需要定位的问题应用进程 然后各种trace -j xx.xxx.xx.className methodName top -n 3 这个后面要补充去看, ...
- Arthas-Java的线上问题定位工具
Arthas(阿尔萨斯) 能为你做什么? Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar ...
- java 线上问题定位工具
在JDK的bin目录下有很多命令行工具: 我们可以看到各个工具的体积基本上都稳定在27kb左右,这个不是JDK开发团队刻意为之的,而是因为这些工具大多数是jdk\lib\tools.jar类库的一层薄 ...
- OOM-killer 线上设置 +vm +OOM机制
http://blog.csdn.net/tenfyguo/article/details/9409743 http://blog.csdn.net/tenfyguo/article/details/ ...
随机推荐
- Jack Straws(poj 1127) 两直线是否相交模板
http://poj.org/problem?id=1127 Description In the game of Jack Straws, a number of plastic or wood ...
- POJ3273--Monthly Expense(Binary Search)
Description Farmer John is an astounding accounting wizard and has realized he might run out of mone ...
- Codeforces Round #265 (Div. 2) C. No to Palindromes! 构造不含回文子串的串
http://codeforces.com/contest/465/problem/C 给定n和m,以及一个字符串s,s不存在长度大于2的回文子串,现在要求输出一个字典比s大的字符串,且串中字母在一定 ...
- Hive ORC + SNAPPY
Hive orc 格式 + snappy 压缩是比较常用的存储加压缩格式. 今天处理下面的场景时,解决了一些问题,记录下来: flume消费kafka的数据实时写入hdfs,通过创建分区表,t + 1 ...
- day08_雷神_模块一
# day08 一.模块 回顾相关: 取值顺序: 在局部调用:局部命名空间->全局命名空间->内置命名空间 在全局调用:全局命名空间->内置命名空间 内置函数: globals(), ...
- FastReport自动换行及行高自适应
- C#常用修饰符
访问修饰符 访问修饰符是一些关键字,用于指定声明的成员或类型的可访问性,C#有4个访问修饰符:public.private.protected.internal,使用这些访问修饰符可以指定以下5个访问 ...
- dotNet Core WEB程序使用 Nginx反向代理
之前记录过一篇 使用 jexus 作为dotNetCore的反向代理,发现jexus的内存占用较大,最终选择使用Nginx的原因就是占用内存较小,以及性能较优(https://www.cnblogs. ...
- 【javascript/PHP】当一个JavaScripter初次进入PHP的世界,他将看到这样的风景
本文将从以下11点介绍javascript和PHP在基础语法和基本操作上的异同: 1.数据类型的异同 2.常量和变量的定义的不同,字符串连接运算符不同 3.对象的创建方法的不同 4.PHP与JS在变 ...
- Flask系列08--Flask中flask_session, redis插件
一.安装 1.flask_session 不想将Session的信息存放在Cookie 将Session存放在Redis Cookie中保存Session的ID flask中的session是直接将数 ...