JVM实战(34)——内存溢出之消息队列处理不当

一、简介

本章,我们将介绍一个因为处理消息队列中的数据不当而引起的内存溢出问题,先来看下系统的背景。

1.1 系统背景

这是一个线上的数据同步系统,专门从Kafka消费其它系统送进去的数据,处理后存储到自己的数据库中:

就这么简单的一个系统,生产上却时不时报出OOM异常,然后就得重启系统。重启系统后,Java堆内存使用率越来越高,直到下次OOM异常。这种情况要么是因为系统并发太高,对象来不及回收,要么就是发生了内存泄漏,很多对象赖在内存里,无论如何就是GC不掉。

根据监控系统的显示,系统的访问量并不高,所以很可能就是因为某种对象”赖在了内存里“,然后不断触发GC,但就是无法回收掉:

二、问题分析

我们通过jstat观察系统运行时JVM的情况,发现老年代的对象一直增长,直到触发Full GC,但是Full GC根本回收不掉老年代中的对象。

下面就要通过MAT来确认下到底是什么对象一直进入老年代,在内存快照中,我们发现有一个队列数据结构,里面引用了大量的对象,正是这些对象一直占据内存不能被回收导致了OOM。

这个队列数据结构是啥?我们根据MAT分析线程调用栈,发现系统从Kafka消费的数据,首会先被存入到该队列数据结构中,然后接着程序再慢慢从这个队列中读数据,做些处理后写入到数据库中:

我们发现,写这个代码的童鞋每次从Kafka消费几百个数据(Kafka支持批量消费数据),把它们存到一个List中,然后再把这个List放入上述的数据结构。这就是导致了数据同步系统中的队列里面积压了几十万甚至几百万的数据,数据处理的速度远远比不上从Kafka消费的速度,只要数据还是停留在队列数据结构中,就无法被回收,这样最终导致了内存溢出:

三、系统优化

根据分析,出现上述问题的根本原因是: 队列的生产和消费速率没有控制好 。从Kafka中消费消息放入内存队列的速度是非常快的,而从内存队列中消费数据进行处理,然后存储到数据库,则相对要慢很多,最终就导致内存队列快速积压数据,引发内存溢出。另外,内存队列中每个元素都是List的做法更是导致了内存队列的容量大幅度膨胀。

所以,解决方案就是限制内存队列中的最大元素个数,然后当内存队列满了以后进行阻塞,每次往内存队列里放数据时也不要再用List,直接一个元素一个元素放,可以用BlockingQueue实现:

四、总结

本章,我们分析了一个因为内存队列处理不当引起的内存泄漏问题,本质是程序逻辑没写好,这也是本系列的最后一章。通过本系列的各个实战案例,相信读者也积累了不少JVM优化的经验,最重要的还是要归纳总结、举一反三,在实践中去印证自己所学的知识,然后再总结完善,最终融会贯通。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/645795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java——运算符

目录 🎈算数运算符 1. 基本四则运算符 2.增量运算符 3.自增/自减运算符 🎈关系运算符 ❗逻辑运算符(重点) 🚩 逻辑与 && 🚩逻辑 || 🚩逻辑非 ! 🚩短路求值——java 🎈位运算…

使用frp透传软件搭建本地运行的私有邮箱服务器

起因:随着我公司在线应用软件的增多,比如wordpress、 next cloud、SuitCRM 、iFair等,许多场合都要求填写邮箱地址,绑定邮箱。因为不想将过多的数据存储于第三方空间,因此考虑在公司局域网内搭建一个私有的电子邮箱服务…

初识计算机网络 | 计算机网络的发展 | 协议初识

1.计算机网络的发展 “矛盾是普遍存在的,矛盾是事物联系的实质内容和事物发展的根本动力!” 计算机在诞生之初,在军事上用来计算导弹的弹道轨迹!在发展的过程中(商业的推动,国家政策推动)&…

软件工程测试2

1.【单选】“数据流的分解一般达到2层数据流就截止”的说法是否正确 A. 正确 B. 错误 答案:B 2.【单选】 在类图中,哪种关系表达总体与局部的关系 A. 泛化 B. 实现 C. 聚合 D. 依赖 答案:C 3.【多选】从UML时序图中我们能够得到(…

ChatGLM论文解读

GLM GLM: General Language Model Pretraining with Autoregressive Blank Infilling 论文地址 1. 背景介绍 1)主流预训练框架 模型介绍结构特点训练目标autoregressive自回归模型,代表GPT,本质上是一个从左到右的语言模型,常用于无条件生成任务(unconditional generat…

openssl3.2/test/certs - 044 - 8192-bit leaf key

文章目录 openssl3.2/test/certs - 044 - 8192-bit leaf key概述笔记END openssl3.2/test/certs - 044 - 8192-bit leaf key 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! * \file D:\my_dev\my_local_git_prj\study\openSSL\test_certs\044\my_openssl_linux_…

composer安装hyperf后,nginx配置hyperf

背景 引入hyperf项目用作微服务,使用composer 安装hyperf后,对hyperf进行nginx配置。 配置步骤 因为hyperf监听的是端口,不像其他laravel、lumen直接指向文件即可。所有要监听端口号。 1 配置nginx server {listen 80;//http&#xff1a…

如何使用宝塔面板配置Nginx反向代理WebSocket(wss)

本章教程,主要介绍一下在宝塔面板中如何配置websocket wss的具体过程。 目录 一、添加站点 二、申请证书 三、配置代理 1、增加配置内容 2、代理配置内容 三、注意事项 一、添加站点 二、申请证书 三、配置代理 1、增加配置内容 map $http_upgrade $connection_…

HBase学习五:运维排障之备份与恢复

1 snapshot简介 1.1 发展史 distcp:关机全备份。HBase的所有文件都存储在HDFS上,因此只要使用Hadoop提供的文件复制工具distcp将HBASE目录复制到同一HDFS或者其他HDFS的另一个目录中,就可以完成对源HBase集群的备份工作 copyTable:在线跨集群备份。copyTable工具通过MapRed…

uniapp移动端——企业微信H5调用jssdk实现扫一扫,通过weixin-java-cp获取ticket签名,配置config

背景: 使用企业微信开发扫一扫功能 可信域名验证 (1)企业微信的可信域名需要和企业微信的备案主体一致。 域名备案主体可通过站长工具查看域名备案主体。https://icp.chinaz.com/ 企业微信备案主体可以咨询管理员 (2)通过nginx配置域名归…

【算法Hot100系列】不同路径

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

LIMS源码,实验室信息系统源码,后端框架:asp.net

LIMS(laboratory information management system)即实验室信息管理系统是实验室管理科学发展的成果,是实验室管理科学与现代信息技术结合的产物,是利用计算机网络技术、数据存储技术、快速数据处理技术等,对实验室进行全方位管理的计算机软件…

代码随想录二刷——数组day2

文章目录 前言数组知识点 一、 977. 有序数组的平方二、209. 长度最小的子数组三、59. 螺旋矩阵 II总结 前言 一个本硕双非的小菜鸡,备战24年秋招,计划二刷完卡子哥的刷题计划,加油! 二刷决定精刷了,于是参加了卡子哥…

【Linux】糟糕,是心动的感觉——与Linux的初次相遇

初识Linux 导言一、计算机的发展1.1 历史背景1.2 计算机的发明 二、操作系统2.1 什么是操作系统?2.2 操作系统的诞生2.3 操作系统的发展2.3.1 批处理系统的发展2.3.2 分时系统2.3.3 实时系统2.3.4 通用操作系统 2.4 UNIX操作系统2.4.1 UNIX的诞生2.4.2 UNIX的发展 2…

开源 C/C++(DuckX)操作docx文旦

目录 1.详情 2.项目示例 1.详情 创建、读取和写入 Microsoft Office Word docx 文件,可以不使用Microsoft Office组件。目前看操作docx文件绕不开Microsoft Office组件,虽然本项目可以读取docx文档,但是里面排版都消失了,除此之…

Mysql的基本操作详解

当涉及到MySQL数据库的基本操作时,我们通常会涉及到创建数据库、创建表格、插入数据、查询数据等操作。下面是一个简要的MySQL基本操作的博客: --- MySQL基本操作详解 MySQL是一个广泛使用的关系型数据库管理系统,为许多应用程序提供了可靠…

BP神经网络需要像深度学习一次次的迭代训练吗?

BP神经网络 答案:是的,BP神经网络需要像深度学习一次次的迭代训练。总结(BP神经网络和深度学习在本质上有以下区别) 答案:是的,BP神经网络需要像深度学习一次次的迭代训练。 BP神经网络(误差反…

2024.1.24 GNSS 学习笔记

1.伪距观测值公式 2.载波相位观测值公式 3.单点定位技术(Single Point Positionin, SPP) 仅使用伪距观测值&#xff0c;不使用其他的辅助信息获得ECEF框架下绝对定位技术。 使用广播星历的轨钟进行定位&#xff0c;考虑到轨钟的米级精度&#xff0c;所以对于<1米的误差&…

Linux:gcc的相关知识

目录 gcc的翻译&#xff08;编译&#xff09;过程&#xff1a; 预处理&#xff1a; 条件编译&#xff1a; 编译&#xff1a; 汇编&链接&#xff1a; 什么是链接&#xff1f; 安装静态库&#xff1a; 静态库的使用&#xff1a; 动态静态的对比&#xff1a; 优缺对比…

IDEA插件(MyBatis Log Free)

引言 在Java开发中&#xff0c;MyBatis 是一款广泛使用的持久层框架&#xff0c;它简化了SQL映射并提供了强大的数据访问能力。为了更好地调试和优化MyBatis应用中的SQL语句执行&#xff0c;一款名为 MyBatis Log Free 的 IntelliJ IDEA 插件应运而生。这款插件旨在帮助开发者…