您现在的位置是:首页 > 正文

生产环境服务OOM问题解决

2024-02-29 13:13:15阅读 3

生产环境服务OOM问题解决

起因:项目是由外包商为主自主开发为辅的一个项目,在定时任务这个服务中,自主开发定时任务仅有3个,后续关闭一个后,仅剩2个任务为我们自主开发的内容,而该服务自2021年1月15日后就反复出现OOM服务异常挂掉的问题,本文章仅做记录与学习内容。

一、相关数据


定时任务服务-executor(后续简称exe服务),通过XXL-JOB的日常跟踪可以得知该服务集群每日处理定时任务约为2W。

jvm 参数如下:
java -javaagent:/opt/agent/skywalking-agent.jar \
  -Dskywalking.agent.service_name=leimingtech-execute \
  -Xms3072m -Xmx3072m -server \
  -XX:+UseParNewGC  \
  -XX:ParallelGCThreads=4 \
  -XX:MaxTenuringThreshold=9  \
  -XX:+UseConcMarkSweepGC \
  -XX:+DisableExplicitGC  \
  -XX:+UseCMSInitiatingOccupancyOnly  \
  -XX:+ScavengeBeforeFullGC   \
  -XX:+UseCMSCompactAtFullCollection  \
  -XX:+CMSParallelRemarkEnabled \
  -XX:CMSFullGCsBeforeCompaction=9  \
  -XX:CMSInitiatingOccupancyFraction=60 \
  -XX:+CMSClassUnloadingEnabled   \
  -XX:SoftRefLRUPolicyMSPerMB=0   \
  -XX:+CMSPermGenSweepingEnabled  \
  -XX:CMSInitiatingPermOccupancyFraction=70 \
  -XX:+ExplicitGCInvokesConcurrent  \
  -XX:+PrintGCDetails \
  -XX:+PrintGCDateStamps \
  -XX:+PrintGCApplicationConcurrentTime \
  -XX:+PrintHeapAtGC -XX:+UseGCLogFileRotation  \
  -XX:+HeapDumpOnOutOfMemoryError   \
  -XX:-OmitStackTraceInFastThrow  \
  -Duser.timezone=Asia/Shanghai \
  -Dclient.encoding.override=UTF-8  \
  -Dfile.encoding=UTF-8   \
  -Djava.security.egd=file:/dev/./urandom \
  -Xloggc:$GC_LOG/gc.log  \
  -XX:NumberOfGCLogFiles=5  \
  -XX:GCLogFileSize=5M  \
  -XX:HeapDumpPath=$GC_LOG/HeapDumpOnOutOfMemoryError/  \
  -jar /app.jar

使用jstat 查询GC数据如下

在这里插入图片描述
得知一小时不到的服务GC回收时间已达到876.192秒

使用jmap查询堆内存内容如下:

在这里插入图片描述
可以看到内存基本已经被吃满了

top -Hp PID 查询结果如下:

在这里插入图片描述
可以看到CPU并没消耗多少,看样子不是死循环中new对象造成的

GC 回收日志如下:

在这里插入图片描述

由上述数据可以得知,服务中存在垃圾无法正常回收,FULL GC 依然不能回收的内存。通过jstack查看得知无线程处于BLOCK状态,线程数量也不是很多,看样子基本可以排除活跃线程产生大量new对象的情况。下面需要导出 dump文件用MAT分析工具进行内存检查。

第一份dump文件

在这里插入图片描述

从Overview里可以看到有一个Unreachable Objects,因为在之前的图中可以看出full gc 无法回收垃圾,基本上内存的消耗都在这些无法回收的内存中了,进入该部分进行查看:
在这里插入图片描述
在Unreachable Objects中我们可以看到大量的HashMap、cn.hutool.json.JSONObject以及cn.hutool.json.JSONConfig多次被创建,这边就针对这三个类型的数据进行分析。通过左侧Class Hierarchy可以分析该类型数据都与那些类相关:
在这里插入图片描述
cn.hutool.json.JSONObject以及cn.hutool.json.JSONConfig 并无Class Hierarchy。
通过HashMap所相关的类的分析中发现有与mongoDB有关的内容。
继续分析与集合有关的内存
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这么多集合类与mongodb有关系,代表在代码中使用mongodb时肯定有多次创建集合的存在。现在服务暂时只有这一台OOM挂掉了,留着他,等2小时候再dump出一份进行比对。

与第二份dump文件compare

一比对,乖乖差距有点大
在这里插入图片描述
在这里插入图片描述
虽然这两个都可以说与第一份dump分析的结果一致,但是差距太大了,等第三份吧。

第三份dump文件compare

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好嘛,三份一起来,基本已经可以确定就是第一份分析的假设了,而那个多次被加载的类并没有出现在大object中,三份dump都没有自己定义的大object,看来是一个对象可能加载次数不多,但是每次使用时可能都会new一些数据,而这些数据使用的是HashMap\LinkedHashMap\ArrayList,并且这个类使用了mongodb。现在只能根据这些信息回去查代码吧。

网站文章

  • pointnet分割自己的点云数据_基于超点图的大规模点云分割

    pointnet分割自己的点云数据_基于超点图的大规模点云分割

    本期介绍一篇基于大规模点云的语义分割相关论文《Large-scale Point Cloud Semantic Segmentation with Superpoint Graphs》本文提出了针对大规模点云的语义分割的框架,有序的点云是可以获取一种叫做超点图(superPoint Graph)的结构的。超点图能够提供点云对象相邻点之间的关联性,这种结构可以将传感器扫描的场景划分为均匀的...

    2024-02-29 13:12:46
  • Win11使用WSL2安装ubuntu,ubuntu桌面配置,ubuntu子系统删除

    Win11, WSL2, Ubuntu, 桌面配置,安装与卸载

    2024-02-29 13:12:39
  • 剑指offer第二版(150M超清分享PDF+源码) 存在百度云(喜欢就点个赞评论一下)

    链接:https://pan.baidu.com/s/1b6ZxVIBvjPfKifToh_h26Q 密码:6t76 https://github.com/zhedahht/ChineseCodingInterviewAppendix(代码) 如需要更多iOS书籍留言!!! 剑指offer 第二版 包含 PDF和源码 各大公司的算法面试题,存在百度云...

    2024-02-29 13:12:32
  • mysql查询语句 和 多表关联查询 以及 子查询 热门推荐

    mysql(三):mysql查询语句 和 多表关联查询 以及 子查询 1.查询一张表: select * from 表名; 2.查询指定字段:select 字段1,字段2,字段3….from 表名; 3.where条件查询:select字段1,字段2,字段3 frome 表名 where 条件表达式;例:select * from t_

    2024-02-29 13:12:24
  • bigdecimal 平均数_java-计算数组列表的平均值?

    当数量不多时,一切似乎都正确。 但是,如果不是这样,则需要非常小心以确保正确性。以double为例:如果不大,如其他人提到的那样,您可以尝试以下简单方法:doubles.stream().mapToD...

    2024-02-29 13:11:51
  • 微服务容器化运维:微博容器运维平台DCP

    微服务容器化运维系列的前两期,我给你详细介绍了微服务容器化后如何运维的几个关键问题:镜像仓库、资源调度、容器调度、服务编排,这些问题的产生都是因为微服务部署的节点从一台台物理机或者虚拟机变成了一个个容...

    2024-02-29 13:11:44
  • 描述linux中的文件分类,linux文件类型以及ls命令介绍

    ls -l列出linux的文件类型,常用的文件类型有:[root@openstackdev]#ls-l总用量0crw-rw----.1rootvideo10,17511月1622:03agpgartcrw-------.1rootroot10,23511月1622:03autofsdrwxr-xr-x.2rootroot...

    2024-02-29 13:11:15
  • 第一章 Object-XML 映射简介 最新发布

    第一章 Object-XML 映射简介 最新发布

    将对象映射到XML一词意味着定义如何将该对象用作XML文档。要将对象映射到XML,请将添加到定义该对象的类的超类列表中,以及该类使用的任何其他对象类(少数例外)。此活动也称为定义定义对象的类的XML映射或支持XML的类。

    2024-02-29 13:11:09
  • tomcat内存溢出总结

    在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。这里根据平时遇到的情况和相关资料进行一个总结。常见的一般会有下面三种情况:        1.OutOfMemoryError: Java heap space        2.OutOfMemoryError: PermGen space        3.OutOfMemoryError:

    2024-02-29 13:11:03
  • 【react】this.setState一个属性,另一个属性值也跟着改变

    目录 一、问题描述 二、问题分析 三、问题解决 1、JSON.stringify将对象转化成字符串 2、JSON.parse把字符串转成新的对象 3、这样创建的对象就会指向新的地址,当进行修改的时候,...

    2024-02-29 13:10:29