服务器上部署了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的更多相关文章

  1. 线上服务内存OOM问题定位[转自58沈剑]

    相信大家都有感触,线上服务内存OOM的问题,是最难定位的问题,不过归根结底,最常见的原因: 本身资源不够 申请的太多 资源耗尽 58到家架构部,运维部,58速运技术部联合进行了一次线上服务内存OOM问 ...

  2. 线上服务内存OOM问题定位

    转自:架构师之路,http://mp.weixin.qq.com/s/iOC1fiKDItn3QY5abWIelg 相信大家都有感触,线上服务内存OOM的问题,是最难定位的问题,不过归根结底,最常见的 ...

  3. 线上服务内存OOM问题定位三板斧

    相信大家都有感触,线上服务内存OOM的问题,是最难定位的问题,不过归根结底,最常见的原因: 本身资源不够 申请的太多 资源耗尽 58到家架构部,运维部,58速运技术部联合进行了一次线上服务内存OOM问 ...

  4. 糟了,线上服务出现OOM了

    前言 前一段时间,公司同事的一个线上服务OOM的问题,我觉得挺有意思的,在这里跟大家一起分享一下. 我当时其实也参与了一部分问题的定位. 1 案发现场 他们有个mq消费者服务,在某一天下午,出现OOM ...

  5. Arthas - Java 线上问题定位处理的终极利器

    前言 在使用 Arthas 之前,当遇到 Java 线上问题时,如 CPU 飙升.负载突高.内存溢出等问题,你需要查命令,查网络,然后 jps.jstack.jmap.jhat.jstat.hprof ...

  6. 线上BUG定位神器(阿尔萨斯)-Arthas2019-0801

    1.下载这个jar 2.运行这个jar 3.选取你需要定位的问题应用进程 然后各种trace -j xx.xxx.xx.className methodName top -n 3 这个后面要补充去看, ...

  7. Arthas-Java的线上问题定位工具

    Arthas(阿尔萨斯) 能为你做什么? Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar ...

  8. java 线上问题定位工具

    在JDK的bin目录下有很多命令行工具: 我们可以看到各个工具的体积基本上都稳定在27kb左右,这个不是JDK开发团队刻意为之的,而是因为这些工具大多数是jdk\lib\tools.jar类库的一层薄 ...

  9. OOM-killer 线上设置 +vm +OOM机制

    http://blog.csdn.net/tenfyguo/article/details/9409743 http://blog.csdn.net/tenfyguo/article/details/ ...

随机推荐

  1. 20169207《Linux内核原理与分析》第八周作业

    本章的作业依旧包括两部分,1.阅读学习教材「Linux内核设计与实现 (Linux Kernel Development)」第教材第11,12章. 2.学习MOOC「Linux内核分析」第六讲「进程的 ...

  2. linux 添加本地yum源

    1.查看自己是否安装了 yum rpm -qa|grep yum 查看yum配置文件 2.创建一个文件夹 用于挂载光盘 这里创建到/media下 取名叫cdrom mkdir /media/cdrom ...

  3. String、Stringbuffer、Stringbuilder三者之间的区别

    1.首先说运行速度,速度由快到慢排列:StringBuilder > StringBuffer > String String最慢的原因: String为字符串常量,而StringBuil ...

  4. SSM_CRUD新手练习(5)测试mapper

    上一篇我们使用逆向工程生成了所需要的bean.dao和对应的mapper.xml文件,并且修改好了我们需要的数据库查询方法. 现在我们来测试一下DAO层,在test包下新建一个MapperTest.j ...

  5. Mysql逻辑分层、存储引擎

    Mysql的逻辑分层: 连接层 服务层 引擎层 存储层 常见的数据库引擎有InnorDB和MylSAM. InnorDB:事物优先,(适合高并发操作:行锁,顾名思义一次锁一行数据) MylSAM:性能 ...

  6. Android FragmentActivity 嵌套 Fragment 调用startActivityForResult返回的requestCode错误

    Android FragmentActivity 嵌套 Fragment 调用startActivityForResult返回的requestCode错误 此时,要在调用startActivityFo ...

  7. Hadoop-1.2.1伪分布下 hive-0.10.0内嵌模式安装

    Hadoop-1.2.1伪分布下 hive-0.10.0内嵌模式安装 1.下载hive-0.10.0 网址是:http://archive.apache.org/dist/hive/hive-0.10 ...

  8. shell 网络状态查询 ping curl telnet

    ping curl telnet python -m SimpleHTTPServer

  9. AngularJS $eval $parse

    $eval $parse都可以解析或计算Angular表达式的值. 一.$parse 是一个独立的可以注入的服务,注入就可以使用,它返回一个函数,我们需要显式将表达式求值的上下文传递给该函数.$par ...

  10. MODBUS串行通信协议详细说明

    第一章  简介 本文详细地描述了装置在MODBUS 通讯模式下的输入和输出命令.信息和数据,以便第三方使用和开发. 1.1 串行通讯协议的目的 通信协议的作用是使信息和数据在上位机主站和装置之间有效地 ...