大家好,我是大彬~

今天给大家分享最近出现的OOM问题。

上周五早上,测试同学反馈测试环境的子系统服务一直超时,请求没有响应。

收到这个问题之后,我有点纳闷,最近这个系统也没有改动代码逻辑,怎么会突然报服务超时的问题。为避免影响测试进度,我赶紧登陆堡垒机查看日志,看看到底啥情况。

首先先看系统负载情况,使用top命令查看。发现其中某个Java进程cpu一直持续停留在100%到200%之间。因为这个系统不涉及大量运算的逻辑,所以可以猜到要不就是死循环的问题,要不就是频繁full gc导致。

查看系统日志发现,出现java.lang.OutOfMemoryError: Metaspace,很明显,元空间内存溢出了。

接着查看系统gc情况,使用以下命令查看。pid为对应的Java进程id,通过top命令获取。参数1000表示每隔1000ms打印一次记录。

jstat -gc pid 1000

一看执行结果,果不其然,full gc 从应用程序启动到采样时已经触发了几百次!这也是cpu一直100%的原因。

其中还有另一个参数 MC(元空间分配内存大小),已经接近设置的最大元空间大小(配置的--XX:MaxMetaspaceSize=128m)。

这里也简单介绍下元空间。

元数据是jdk8里特有的数据结构,jdk7是叫永久代,到了jdk8永久代就废弃了,使用元空间替代。元空间被分配在本地内存中(非堆上),默认不限制内存使用,可以使用 MaxMetaspaceSize 指定最大值。

元空间由两大部分组成

  • Klass Metaspace,用来存klass的,klass是class文件在jvm里的运行时数据结构。
  • NoKlass Metaspace,专门来存klass相关的其他的内容,比如method,常量池等,这块内存是由多块内存组合起来的。

MC 就是Klass Metaspace以及NoKlass Metaspace两者总共分配的内存大小,单位是KB。上图中,MC已经接近元空间设置的上限值,也就是此时元空间内存已经不够用了,导致一直触发full gc。

然后就是dump内存进行分析,看看是什么原因导致的元空间内存溢出。使用命令./jmap -dump:live,format=b,file=/xxx 导出内存heap到xxx位置(hprof格式),然后使用MAT工具进行分析。

将hprof文件导入MAT工具,打开内存泄漏分析(涉及公司内部源码,所以打了马赛克):

看到这个之后,就大概知道是什么问题了。因为最近公司内部在推广一个漏洞监控工具,需要在服务端部署agent程序,这个工具会收集、监控应用程序运行时函数执行、数据传输,可以识别常见的安全缺陷和漏洞。而打码的部分正是这个漏洞监控工具的应用包名,很可能是引入这个工具引起的问题!

进一步确认问题。打开Histogram:

Shallow Heap 代表一个对象结构自身所占用的内存大小,不包括其属性引用对象所占的内存。

Retained Heap 是一个对象被 GC 回收后,可释放的内存大小,等于释放对象的 Retained Heap 中所有对象的 Shallow Heap 的和。

在Histogram视图中,选中其中一个类点击鼠标右键会弹出一个菜单,选择Merge shortest paths to GC Roots,查看当前对象到GC Root的路径,可以过滤一些类型的引用。

结果如下:

占用内存空间最多的就是漏洞监控工具的类,也基本可以确定问题所在了。

最后把这个漏洞监控工具去掉之后,重新部署之后,就不会出现服务超时的问题了。

以上就是本期OOM问题分析的整个过程~

码字不易,如果觉得对你有帮助,可以点个赞鼓励一下!

我是程序员大彬 ,专注Java后端硬核知识分享,欢迎大家关注~

记一次oom问题排查的更多相关文章

  1. 记一次OOM问题排查过程

    上周运维反馈线上程序出现了OOM,程序日志中的输出为 Exception in thread "http-nio-8080-exec-1027" java.lang.OutOfMe ...

  2. 坑爹坑娘坑祖宗的87端口(记一次tomcat故障排查)

    原贴如下 坑爹坑娘坑祖宗的87端口(记一次tomcat故障排查) 虽然我用的是PHPstudy部署的dedecms,还是一样栽倒这个坑里了. 总结经验:本地测试使用8000~9000的端口比较安全.

  3. 一次线上OOM故障排查经过

    转贴:http://my.oschina.net/flashsword/blog/205266 本文是一次线上OOM故障排查的经过,内容比较基础但是真实,主要是记录一下,没有OOM排查经验的同学也可以 ...

  4. 记一次NoHttpResponseException问题排查

    上传文件程序会有一定的概率提示错误,错误率大概在1%以下,错误信息是:org.apache.http.NoHttpResponseException , s3-us-west-1.amazonaws. ...

  5. 记一次用arthas排查jvm中CPU占用过高问题

    记一次使用arthas排查jvm中CPU占用过高问题.这工具屌爆了 碾压我目前使用的全部JVM工具. 安装 小试 curl -O https://arthas.aliyun.com/arthas-bo ...

  6. BUGFIX 09 - 记一次Java中String的split正则表达式匹配 - 引发`OutOfMemoryError: Java heap space`的oom异常 排查及解决 -Java根据指定分隔符分割字符串,忽略在引号里面的分隔符

    问题简述 说白了,Java根据指定分隔符分割字符串,忽略在引号(单引号和双引号)里面的分隔符; oom压测的时候,正则匹配"(?=(?:[^\"]*\"[^\" ...

  7. JAVA本地环境启动OOM问题排查

    1.问题描述 每次启动信息报错如下: 2.排查过程 2.1起初怀疑是堆内存不够: 将本地队内存调整由-Xms512M,-Xmx1024M,改成与测试环境相同1536M,还是失败 如上图报错中有noti ...

  8. 记一次tomcat故障排查(转)

    1~1024之间的端口号是保留端口,通常是为特定目的预留的.虽然你的问题不是由于保留端口引起的,但是仍然建议你不要随意使用保留端口作为自定义服务的端口,如果你能早早遵循这一规则压根就不会遇到这个问题. ...

  9. 记一次jvm异常排查及优化

    为方便自己查看,根据工作遇到的问题,转载并整理以下jvm优化内容 有次接到客服反馈,生产系统异常,无法访问.接到通知紧急上后台跟踪,查看了数据库死锁情况--正常,接着查看tomcat 内存溢出--正常 ...

随机推荐

  1. 日期与时间函数(Excel函数集团)

    此处文章均为本妖原创,供下载.学习.探讨! 文章下载源是Office365国内版1Driver,如有链接问题请联系我. 请勿用于商业!谢谢 下载地址:https://officecommunity-m ...

  2. 项目的基本概念(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 我一看到这个标题就头疼,好吧,又是概念,好在我不要参加相关的考试,否则文字连同标点符号都得背%¥#%#~ 张同学说,项目& ...

  3. 自动化集成:Pipeline流水语法详解

    前言:该系列文章,围绕持续集成:Jenkins+Docker+K8S相关组件,实现自动化管理源码编译.打包.镜像构建.部署等操作:本篇文章主要描述Pipeline流水线用法. 一.Webhook原理 ...

  4. python 快速启动http监听服务

    python3 [root@vm10-20-9-45 ~]# python3 -m http.server 2378 Serving HTTP on 0.0.0.0 port 2378 (http:/ ...

  5. .net Core 使用 iTextSharp 生成PDF 简单示例

    在 Nuget 中导入需要的插件: 实现的代码: 1 [HttpGet, Route("CreatePdf")] 2 public Response CreatePdf() 3 { ...

  6. AcWing822. 走方格

    题目 给定一个\(n×m\)的方格阵,沿着方格的边线走,从左上角\((0,0)\)开始,每次只能往右或者往下走一个单位距离,问走到右下角\((n,m)\)一共有多少种不同的走法. 输入格式 共一行,包 ...

  7. c++设计模式概述之代理

    代码写的不规范,目的是缩短文章篇幅,实际中请不要这样做. 1.模式的结构 代理模式的主要角色如下: A.抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法. B.真实主 ...

  8. 【LeetCode】454. 4Sum II 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 日期 题目地址:https://leetcod ...

  9. javascript原始值和引用值类型及区别

    原始值和引用值类型及区别 首先,原始值和引用值类型都是js中的数据类型,为了充分利用存储空间,定义了不同的数据类型,而且js是弱类型,动态语言,数据类型可变. 原始值(简单数据类型) 存储在栈中的简单 ...

  10. JUC之线程间定制化通信

    线程通信之定制化 之前文章中写了下Condition的使用,这里我们详细说下其中的用法: 首先使用Condition需要实例化Lock private Lock lock = new Reentran ...