服务器上部署了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. java基础-day29

    第06天 MySQL数据库 今日内容介绍 u MySQL单表查询 u SQL约束 u 多表操作 第1章   MySQL单表查询 1.1  SQL单表查询--排序 1.1.1 排序格式 通过order ...

  2. c# json转换成dynamic对象,然后在dynamic对象中动态获取指定字符串列表中的值

    using Newtonsoft.Json;using System;using System.Collections.Generic;using System.Linq;using System.T ...

  3. hdu 4939 三色塔防

    http://acm.hdu.edu.cn/showproblem.php?pid=4939 给出一条长为n个单位长度的直线,每通过一个单位长度需要 t 秒. 有3种塔,红塔可以在当前格子每秒造成 x ...

  4. POJ2779 线性DP 或 杨氏三角 和 钩子公式

    POJ2779 线性DP 或 杨氏三角 和 钩子公式 本来就想回顾一下基础的线性DP谁知道今早碰到的都是这种大难题,QQQQ,不会 这个也没有去理解线性DP的解法,了解了杨氏三角和钩子公式,做出了PO ...

  5. bootstrap1.3

    <html>   <head>   <meta charset="UTF-8">   <title></title>   ...

  6. PICT用户手册 [转]

    PICT 3.3 User's Guide Jacek Czerwonka, Test Lead, Microsoft Corporation Overview Using PICT to Combi ...

  7. 中科大debian 9 + docker源设置

    wget https://mirrors.ustc.edu.cn/repogen/conf/debian-http-4-stretch -O sources.list sudo apt-get ins ...

  8. bootstrap基础学习小记(二)排版、列表、代码风格、表格

    排版——标题.副标题.段落(正文文本).强调内容.粗体.斜体.强调相关的类.文本对齐 <!DOCTYPE HTML> <html> <head> <meta ...

  9. ionic 2.x 3.x 打包 压缩

    大家都知道Ionic项目ionic serve生成的js css 非常庞大,小有1m多,大有几m,文件如此大load页面的时候需要较长时间的加载,特别在生产环境中,灰常不利于用户体验. 因此我们需要进 ...

  10. 回头探索JDBC及PreparedStatement防SQL注入原理

    概述 JDBC在我们学习J2EE的时候已经接触到了,但是仅是照搬步骤书写,其中的PreparedStatement防sql注入原理也是一知半解,然后就想回头查资料及敲测试代码探索一下.再有就是我们在项 ...