记一次oom问题排查
大家好,我是大彬~
今天给大家分享最近出现的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问题排查的更多相关文章
- 记一次OOM问题排查过程
上周运维反馈线上程序出现了OOM,程序日志中的输出为 Exception in thread "http-nio-8080-exec-1027" java.lang.OutOfMe ...
- 坑爹坑娘坑祖宗的87端口(记一次tomcat故障排查)
原贴如下 坑爹坑娘坑祖宗的87端口(记一次tomcat故障排查) 虽然我用的是PHPstudy部署的dedecms,还是一样栽倒这个坑里了. 总结经验:本地测试使用8000~9000的端口比较安全.
- 一次线上OOM故障排查经过
转贴:http://my.oschina.net/flashsword/blog/205266 本文是一次线上OOM故障排查的经过,内容比较基础但是真实,主要是记录一下,没有OOM排查经验的同学也可以 ...
- 记一次NoHttpResponseException问题排查
上传文件程序会有一定的概率提示错误,错误率大概在1%以下,错误信息是:org.apache.http.NoHttpResponseException , s3-us-west-1.amazonaws. ...
- 记一次用arthas排查jvm中CPU占用过高问题
记一次使用arthas排查jvm中CPU占用过高问题.这工具屌爆了 碾压我目前使用的全部JVM工具. 安装 小试 curl -O https://arthas.aliyun.com/arthas-bo ...
- BUGFIX 09 - 记一次Java中String的split正则表达式匹配 - 引发`OutOfMemoryError: Java heap space`的oom异常 排查及解决 -Java根据指定分隔符分割字符串,忽略在引号里面的分隔符
问题简述 说白了,Java根据指定分隔符分割字符串,忽略在引号(单引号和双引号)里面的分隔符; oom压测的时候,正则匹配"(?=(?:[^\"]*\"[^\" ...
- JAVA本地环境启动OOM问题排查
1.问题描述 每次启动信息报错如下: 2.排查过程 2.1起初怀疑是堆内存不够: 将本地队内存调整由-Xms512M,-Xmx1024M,改成与测试环境相同1536M,还是失败 如上图报错中有noti ...
- 记一次tomcat故障排查(转)
1~1024之间的端口号是保留端口,通常是为特定目的预留的.虽然你的问题不是由于保留端口引起的,但是仍然建议你不要随意使用保留端口作为自定义服务的端口,如果你能早早遵循这一规则压根就不会遇到这个问题. ...
- 记一次jvm异常排查及优化
为方便自己查看,根据工作遇到的问题,转载并整理以下jvm优化内容 有次接到客服反馈,生产系统异常,无法访问.接到通知紧急上后台跟踪,查看了数据库死锁情况--正常,接着查看tomcat 内存溢出--正常 ...
随机推荐
- 大规模服务网格性能优化 | Aeraki xDS 按需加载
作者 钟华,腾讯云专家工程师,Istio project member.contributor,专注于容器和服务网格,在容器化和服务网格生产落地方面具有丰富经验,目前负责 Tencent Cloud ...
- CPU中断数查看与网卡中断绑核
CPU中断数查看 多核CPU每个核心CPU发生中断的数量查看 # mpstat -I SUM -P ALL 1 3 Linux 5.4.0-40-generic (verify-new-511kern ...
- xml数据结构处理
<data> <country name="Liechtenstein"> <rank updated="yes">2< ...
- There is a cycle in the hierarchy! role对象此时是什么错误
There is a cycle in the hierarchy! role对象此时是什么错误
- 小白误入(<<<绝没有针对>>>)企业级架构介绍与IP tables防火墙介绍
内容详细 架构图 架构图详解 架构: 把一个整体(完成人类生存的所有工作)切分成不同的部分(分工),由不同角色来完成这些分工,并通过建立不同部分相互沟通的机制,使得这些部分能够有机的结合为一个整体,并 ...
- 使用openssl生成证书,并通过Nginx配置
创建服务器证书密钥文件 server.key openssl genrsa -des3 -out server.key 2048 这个时候会提示输入密码 这个密码要记住 openssl语法 opens ...
- LocalDateTime与Date相互转换
LocalDateTime 转 Date LocalDateTime localDateTime=LocalDateTime.now() Date date = Date.from(localDate ...
- LeetCode每日一题打卡组队监督!刷题群!
近 2000 人已经加入共同刷题啦! 群友每天都会在群里给大家讲解算法题 每周日「负雪明烛」组织直播讲题 我相信来看我博客的大部分人都是通过LeetCode刷题过来的.最近发现LeetCode中文网站 ...
- 1276 - Very Lucky Numbers
1276 - Very Lucky Numbers PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 32 ...
- idea使用教程-常用设置
[1]进入设置: [2]设置主题: [3]编辑区的字体变大或者变小: [4]鼠标悬浮在代码上有提示: [5]自动导包和优化多余的包: 手动导包:快捷键:alt+enter 自动导包和优化多余的包: [ ...