当前位置: 首页 > 编程日记 > 正文

小编带你进入强如 Disruptor 也发生内存溢出?

前言
OutOfMemoryError 问题相信很多朋友都遇到过,相对于常见的业务异常(数组越界、空指针等)来说这类问题是很难定位和解决的。

本文以最近碰到的一次线上内存溢出的定位、解决问题的方式展开;希望能对碰到类似问题的同学带来思路和帮助。

主要从表现-->排查-->定位-->解决 四个步骤来分析和解决问题。

表象
最近我们生产上的一个应用不断的爆出内存溢出,并且随着业务量的增长出现的频次越来越高。

该程序的业务逻辑非常简单,就是从 Kafka 中将数据消费下来然后批量的做持久化操作。

而现象则是随着 Kafka 的消息越多,出现的异常的频次就越快。由于当时还有其他工作所以只能让运维做重启,并且监控好堆内存以及 GC 情况。

重启大法虽好,可是依然不能根本解决问题。

排查
于是我们想根据运维之前收集到的内存数据、GC 日志尝试判断哪里出现问题。

结果发现老年代的内存使用就算是发生 GC 也一直居高不下,而且随着时间推移也越来越高。

结合 jstat 的日志发现就算是发生了 FGC 老年代也已经回收不了,内存已经到顶。

甚至有几台应用 FGC 达到了上百次,时间也高的可怕。

这说明应用的内存使用肯定是有问题的,有许多赖皮对象始终回收不掉。

定位
由于生产上的内存 dump 文件非常大,达到了几十G。也是由于我们的内存设置太大有关。

所以导致想使用 MAT 分析需要花费大量时间。

因此我们便想是否可以在本地复现,这样就要好定位的多。

为了尽快的复现问题,我将本地应用最大堆内存设置为 150M。

然后在消费 Kafka 那里 Mock 为一个 while 循环一直不断的生成数据。

同时当应用启动之后利用 VisualVM 连上应用实时监控内存、GC 的使用情况。

结果跑了 10 几分钟内存使用并没有什么问题。根据图中可以看出,每产生一次 GC 内存都能有效的回收,所以这样并没有复现问题。

没法复现问题就很难定位了。于是我们 review 代码,发现生产的逻辑和我们用 while 循环 Mock 数据还不太一样。

查看生产的日志发现每次从 Kafka 中取出的都是几百条数据,而我们 Mock 时每次只能产生一条。

为了尽可能的模拟生产情况便在服务器上跑着一个生产者程序,一直源源不断的向 Kafka 中发送数据。

果然不出意外只跑了一分多钟内存就顶不住了,观察左图发现 GC 的频次非常高,但是内存的回收却是相形见拙。

同时后台也开始打印内存溢出了,这样便复现出问题。

解决
从目前的表现来看就是内存中有许多对象一直存在强引用关系导致得不到回收。

于是便想看看到底是什么对象占用了这么多的内存,利用 VisualVM 的 HeapDump 功能可以立即 dump 出当前应用的内存情况。

结果发现 com.lmax.disruptor.RingBuffer 类型的对象占用了将近 50% 的内存。

看到这个包自然就想到了 Disruptor 环形队列。

再次 review 代码发现:从 Kafka 里取出的 700 条数据是直接往 Disruptor 里丢的。

这里也就能说明为什么第一次模拟数据没复现问题了。

模拟的时候是一个对象放进队列里,而生产的情况是 700 条数据放进队列里。这个数据量是 700 倍的差距。

而 Disruptor 作为一个环形队列,再对象没有被覆盖之前是一直存在的。

我也做了一个实验,证明确实如此。

我设置队列大小为 8 ,从 0~9 往里面写 10 条数据,当写到 8 的时候就会把之前 0 的位置覆盖掉,后面的以此类推(类似于 HashMap 的取模定位)。

所以在生产上假设我们的队列大小是 1024,那么随着系统的运行最终肯定会导致 1024 个位置上装满了对象,而且每个位置是 700 个!

于是查看了生产上 Disruptor 的 RingBuffer 配置,结果是:1024*1024。

这个数量级就非常吓人了。

为了验证是否是这个问题,我在本地将该值换为 2 ,一个最小值试试。

同样的 128M 内存,也是通过 Kafka 一直源源不断的取出数据。通过监控如下:

跑了 20 几分钟系统一切正常,每当一次 GC 都能回收大部分内存,最终呈现锯齿状。

这样问题就找到了,不过生产上这个值具体设置多少还得根据业务情况测试才能知道,但原有的 1024*1024 是绝对不能再使用了。

总结
虽然到了最后也就改了一行代码(还没改,直接修改配置),但这排查过程我觉得是有意义的。

也会让大部分觉得 JVM 这样的黑盒难以下手的同学有一个直观的感受。

转载于:https://blog.51cto.com/13842645/2166013

相关文章:

数据库反规范设计

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 反规范化设计 为了提升性能而使用反规范化设计 常用方法&#xff1a; A、在多个表中存储某个字段的副本 B、在父表中存储汇总值 C、将活动数据和历史数据分开存储 D、应用程序本地缓…

安卓的两种界面编写方式对比

1.XML进行描述 优点是可以直接在Android studio Preview 栏中查看效果(所见即所得&#xff0c;但是不是所有的都可以立刻看到效果) 注意&#xff1a;包含两种方式-编辑layout文件夹下的XML文件 和 直接从下图的图形化界面操作 2.Java/Kotlin代码进行编写 随着学习的深入&#x…

对象***已断开连接或不在该服务器上 的解决方案之一

使用VS2008在发布网站的时候&#xff0c;出现了这样的一个错误&#xff0c;先前一直是OK的。网上找了老半天&#xff0c;几乎没有此问题的解决办法。很是郁闷。只能一个一个地进行编译。单个层Build是OK的&#xff0c;整个Solution的Rebuild也是OK的&#xff0c;一开始使用VS自…

Web.XML文件中关于代码提示的一些问题

1. 问题描述 在进行ssm的整合时&#xff0c;我发现在web.xml文件中里按了alt/以后没有下面的提示&#xff1a;这样真的很不爽。。。于是弄了半天&#xff08;主要是等着&#xff09;终于解决了&#xff0c;特此写篇博客记录下。 2. 解决方案 在eclipse中安装Spring IDE的插件&a…

安卓开发之点九图

Nine-Patch图 xxx.9.png 口诀&#xff1a;左上进行拉伸&#xff0c;右下进行显示。

ImportError: No module named images

&#xff3b;问题&#xff3d; 在使用学习wxPython时&#xff0c;一个Dem抱有如题所示错误 &#xff3b;解决&#xff3d; images 只不过是wxpython自带demo中的一个文件 体验wxpython IN action的时候ImportError: No module named images替换为import wx.py.images as images…

从 Java 到 Scala(二):object

本文由 Rhyme 发表在 ScalaCool 团队博客。 object是一种让静态回归常态、打破模式、天然的语言特性。 其实在写这篇文章之前&#xff0c;我思绪万千&#xff0c;迟迟不能落笔&#xff0c;总想着自己会不会遗漏了某个知识点&#xff0c;或者有讲得不太那么准确的地方&#xff0…

Python获取屏幕分辨率大小

获取屏幕大小有两种方法可以办到: 1.wxPython里的 2.win32api 1 #coding:gb23122 #wxApp.py 3 #author: aoogur4 importos5 importwx6 fromwin32api importGetSystemMetrics7 8 classFrame(wx.Frame):9 def__init__(self):10 wx.Frame.__init__(self,None,-1,title"wxApp.…

安卓事件传递机制

1.触摸事件 MotionEvent ACTION_DOWN:按下 ACTION_MOVE:移动 ACTION_UP:松开 2.以上三个触摸事件都会经历三个函数 事件分发&#xff08;Dispatch&#xff09;&#xff1a;dispatchTouchEvent 事件拦截 &#xff08;Intercept&#xff09;&#xff1a;onInterceptTouchEvent 事…

财务软件的管理监督

随着现代企业的发展&#xff0c;企业财务管理的内涵、外延、功能及其地位发生了深刻的变化&#xff0c;强化企业的财务管理已经成为现代企业在激烈的市场竞争中得以生存和发展、现代企业制度得以保证和实施的重要环节。财务管理软件的应用已经非常普及了。 现代企业财务管…

[Vue CLI 3] 插件编写实战和源码分析

当你看过了官方的几个插件之后&#xff0c;慢慢地&#xff0c;其实你也有需求了。 那如何编写一个 Vue CLI 3 的插件呢&#xff1f;本文代码已经放到 github 上&#xff0c;地址&#xff1a;https://github.com/dailynodej... 我们建一个文件夹&#xff0c;取名 vue-cli-plugin…

突然想起99年的那次离别

今天妹妹离开成都回家了突然发现某一件事情又那么蹿了出来了&#xff0c;是99年的秋天那次&#xff0c;同f到成都且分开的那短暂的2天&#xff01;很多年了&#xff0c;不知道是忘记了再回忆起&#xff0c;还是一直埋在最深处&#xff0c;瞬间又重现&#xff01;想了&#xff0…

列表组件之ListView

1.ListView是什么 一个显示可滚动项目的视图组件系统使用Adapter(适配器)将列表项目插入列表适配器从来源提取内容 下图从MVC分析的话&#xff0c;ListView相当于View&#xff0c;Adapter相当于Controller&#xff0c;data相当于Model 缺点&#xff1a;屏幕里面只能展示有限个…

C#杂记系列之日期函数

//2008年4月24日 System.DateTime.Now.ToString("D"); //2008-4-24 System.DateTime.Now.ToString("d"); //2008年4月24日 16:30:15 System.DateTime.Now.ToString("F"); //2008年4月24日 16:30 System.DateTime.Now.ToString("f"); /…

对着电脑笑了二十分钟(2)

25、有一次我大叔见我小姑在搽大宝&#xff0c;突然大叫一声&#xff1a;“你皮肤这么好&#xff0c;还用护舒宝啊&#xff1f;”26、老师留下作业&#xff0c;我不会做就抄别人的&#xff0c;然后去办公室交作业&#xff0c;看见老师说&#xff1a;“我抄完了&#xff01;”27…

ORACLE临时表空间

https://www.cnblogs.com/kerrycode/p/4006840.html转载于:https://www.cnblogs.com/elontian/p/9564296.html

列表组件之RecyclerView

灵活体现在 ListView 只支持上下滑动 RecyclerView 可以左右滑动&#xff0c;可以瀑布流 并且默认支持布局&#xff1a;线性布局、网络布局 RecyclerView将很多固定模式的地方抽象出来了&#xff0c;如用于动画的ItemAnimator和用于布局的LayoutManager Adapet的特点 1.ViewHo…

【WPF】一个简单的ColorPicker控件

在斯克迪亚看到一篇WPF动态改变主题颜色的文章&#xff0c;来了兴趣&#xff0c;于是自己搞了个简单的ColorPicker控件。 控件其实很简单&#xff0c;定义了5个依赖属性 FinalBrushProperty, AProperty, RProperty, GProperty, BProperty 然后当A,R,G,B发生变化时&#xff0c;…

javascript 利用 - 枚举思想 - 添加地名的一个小例子

利用枚举思想来添加地名&#xff0c;主要功能是&#xff1a;判断点击a标签&#xff08;即当前的地名&#xff09;如果在ul的li不存在的话那么就添加&#xff0c;有则不添加&#xff0c;而且还提供了相应的排序功能... HTML代码&#xff1a; <div id"china"> &l…

[MaxCompute MapReduce实践]通过简单瘦身,解决Dataworks 10M文件限制问题

用户在DataWorks上执行MapReduce作业的时候&#xff0c;文件大于10M的JAR和资源文件不能上传到Dataworks&#xff0c;导致无法使用调度去定期执行MapReduce作业。 解决方案&#xff1a; 第一步&#xff1a;大于10M的resources通过MaxCompute CLI客户端上传&#xff0c; 客户端下…

根据给定数据创建JSON并验证

首先可以判断&#xff0c;temp和weather的值是对象&#xff0c;success的值为布尔型&#xff0c;notification的值为一个数组 {"temp":{"min":11.34,"max":19.01},"weather":{"id":"801","condition":…

C# + MySql 存贮过程开发示例

MySql 发展至今&#xff0c;已经不是当初那个只依靠免费和速度取胜的开源数据库服务器了&#xff0c;它提供的一系列 GUI 工具&#xff0c;以及加入商业数据库的一些特性&#xff0c;依然免费并且开源&#xff0c;让我们实在无法拒绝它的魅力。 很多人在谈及 MySql 可能会条件反…

[C#]判断是否是合法的IP4,IP6地址

判断一个字符串如果没有端口的话&#xff0c;利用IPAddress.TryParse很好判断&#xff0c;那么有端口怎么判断呢&#xff0c;正则表达式&#xff1f;还是其他方式&#xff1f; 关键代码&#xff1a; /// <summary>/// 判断是否是合法的IP4,IP6地址/// </summary>//…

Centos 7使用vsftpd搭建FTP服务器

FTP&#xff0c;即&#xff1a;文件传输协议&#xff08;File Transfer Protocol&#xff09;&#xff0c;基于客户端/服务器模式&#xff0c;默认使用20、21端口号&#xff0c;其中端口20&#xff08;数据端口&#xff09;用于进行数据传输&#xff0c;端口21&#xff08;命令…

Android中的网络(字节跳动)

文章目录RESTful API对REST的解释资源与URI什么是URIHTTP URL的组成Http 接口JSONHttp资源XMLJSONAndroid中对JSON的处理方法一&#xff1a;org.json.JSONObject方法二&#xff1a;GSON(toJson,fromJson)RetrofitRESTful API 对REST的解释 REST描述的是在网络中客户端和服务端…

编写和调试Shader程序(1)

编写和调试Shader程序&#xff08;1&#xff09;DirectX EffectEditJohnsonFeng常用的Shader编写程序有ATI Render Monkey和NVIDIA FX Composer,另外还有DirectX自带的EffectEdit。这几款工具都比较容易上手&#xff0c;本文先介绍DirectX的EffectEdit。EffectEdit是DirectX9.0…

(24):(行为型模式) Visitor 访问者模式

[所有分类] 转载于:https://www.cnblogs.com/hyp5490-/p/3891411.html

二十二、新人成才之路《做人七项原则 做一个节俭惜福的人》

人的福报有先天福报和后天福报。先天福报是从出生时&#xff0c;就注定的。你是个有福的人&#xff0c; 还是个福气少的人。比如出身富贵之家的孩子&#xff0c;可能天生福报较大。出身贫穷人家的孩子&#xff0c; 天生福报可能就较小。也有贫苦孩子通过奋斗努力&#xff0c;最…

代码版本控制工具Concurrent Versions System(CVS)的三种用配置库更新本地工作目录文件的方法

(1)选中文件右键->team->update (2)选中文件右键->replace with->latest from HEAD (3)选中文件右键->team->synchronize with repository 注&#xff1a;第三种方法会以可视化的方式让用户对比本地工作目录和远程配置库中文件的区别 可以用当中的copy方法来…

SPOJ AMR10I Dividing Stones --DFS

题意&#xff1a;给n个石头&#xff0c;分成一些部分&#xff08;最多n部分&#xff0c;随便分&#xff09;&#xff0c;问分完后每部分的数量的乘积有多少种情况。 分析&#xff1a;可以看出&#xff0c;其实每个乘积都可以分解为素数的乘积&#xff0c;比如乘积为4&#xff0…