OutOfMemoryException异常解析

一、概述

在国庆休假快结束的最后一天晚上接到了部门老大的电话,某省的服务会出现崩溃问题。需要赶紧修复,没错这次的主角依旧是上次的“远古项目”没有办法同事都在休假没有人能帮忙开电脑远程只能打车去公司。远程链接上服务器之后查看日志发现抛出的堆栈异常信息中包含了这样一句话“OutOfMemoryException”,在A.dll中。

这个“远古项目”大致情况如下:

  • 1.框架版本为.net framework 4

  • 2.代码结构混乱

  • 3.需要通过socket连接大量的物理设备采集数据(1000台左右)

  • 4.每小时采集一次,并由“远古项目”接收并转发

二、问题分析

(1)根据日志定位问题

其实日志中能给定的错误信息有限,但是也有很大帮助起码知道问题出在哪一块。这时候直接找到A类库查看源码,这时候发现项目当中这一块代码非常多大约1000行左右,这么多代码到底哪一句出了问题不得而知。同时如果我想复现的话并不能有那么多的设备去模拟测试。这时候其实是有点晕的,这时候只能硬着头皮把“OutOfMemoryException”这个异常拿去google一样,结果发现是线程方面的内存溢出问题。那么这时候缩小了查看代码的范围,就开始在代码中搜索Thread对象的使用。查看了半天果然有发现,看到了如下一段代码:

//...代码上下文
byte[] sendbytes = new byte[] { xxx };
var thread = new Thread((_) =>
{Send(sendbytes);
});
thread.Start();
//...代码上下文

这段代码存在的地方大概是,在所有设备在每小时采集一次数据的时候会集中在某一个时间段里大量的发送数据若干次,且每台设备每次发送数据的时候都会创建线程去发送数据。看到这一段代码的时候我人都麻了。

(2)根据问题代码继续分析

在程序开发中,创建线程的代价是非常高昂的。而且都集中在一个时间点上去频繁创建线程这样的代码肯定不行。这段代码极有可能就是引发这个异常的原因之一。分析到这里突然想起之前看过的一本书,书中描述了这样一段话:

“线程栈往往都很小。windows上默认情况下栈最大为1MB,并且大多数线程通常只使用很少的栈页(stack page)。….”(书名:.NET性能分析)

基于以上理论增加了那段代码引起崩溃的可能性怀疑。那么只能抱着试一试的心态继续往下做。

三、解决方案

那么发现了可能导致异常的代码如何去解决呢?这时候又有点头疼了,因为我暂时能想到的解是:

Answer:利用生产消费者模式建立发送队列,然后开启一个常驻的发送线程慢慢发就可以了。

但是问题来了,“远古项目”中结构太过混乱牵一发动全身的连最简单的这种思路实现都会有很多阻碍。而且框架版本过于低一些新语法特性也不能使用。

这个时候在想如果想解决这个问题应该要死扣住以下几点:

  • 1.不能频繁创建线程

  • 2.不能对代码有过大的改动

  • 3.对线程创建以及数量要有良好的控制

  • 4.不能考虑使用新语法特性

ThreadPool这个对象不是刚好满足这个情况吗,这时候将代码修改为:

byte[] sendbytes = new byte[] { 0 };
ThreadPool.QueueUserWorkItem(_=> 
{Send(sendbytes);
});

其实实现这一段代码之后,心里依旧没有解决问题的喜悦。因为根据线程池的原理,如果任务量过大的话还是会开辟默认线程数量以外的新线程。但是线程池对线程管理比较好,这样的该的结果就能直接提交代码重新去服务器上部署吗?心里还是没有底我又做了如下测试:

//模拟在同一个时间点内大量开启线程模拟多设备发送数据
for (int i = 0; i < 10000; i++)
{var thread = new Thread((_) =>{//模拟发送数据耗时Thread.Sleep(1000);});thread.Start();
}

观察VS内存监测变化。

8f90c59a7d52758fd3bb919ef45f5f50.png

发现在大量创建线程的时候CPU和内存占用会陡增。那么接下来我在试一试用线程池去执行这些操作会是一个什么情况代码修改如下:

for (int i = 0; i < 100000; i++)
{ThreadPool.QueueUserWorkItem(_=> {Thread.Sleep(1000);});
}

继续观察VS内存监测变化。

55329bc15427e8205e7efbddf4ddbe47.png

发现几乎没有任何波澜,看到这个测试结果只能说感谢微软实现了一个如此优秀的线程池。这个时候由于时间紧迫只能先改一版本拿到服务器上去顶一阵肯定比上一个版本要好。

问题又来了如果再继续出现问题怎么继续排查?下一次不一定能抛出更有用的信息。这个时候想到的解决方案如下:

  • 1.添加DUMP文件输出

  • 2.关键敏感地方加强日志信息详细程度和适量try块捕获异常

到此耗时大约3小时左右,编译好版本部署到服务器上再做观察。就这样观察了一个多星期没有再次出现崩溃异常。其实分析下来,发现对这个问题发生原理可能还没有玩明白需要继续研究。

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

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

相关文章

LeetCode:Largest Number - 求整型数组中各元素可拼合成的最大数字

2019独角兽企业重金招聘Python工程师标准>>> 1、题目名称 Largest Number&#xff08;求整型数组中各元素可拼合成的最大数字&#xff09; 2、题目地址 https://leetcode.com/problems/largest-number/ 3、题目内容 英文&#xff1a;Given a list of non negative i…

js实现样式切换

2019独角兽企业重金招聘Python工程师标准>>> <ul id"styles"> <li id"default">经典</li> <li id"blue">淡蓝</li> <li id"brown">棕色</li> </ul> $("#styles li&…

CV算法面试题学习

本文记录了CV算法题的学习。 CV算法面试题学习 1 点在多边形内&#xff08;point in polygon&#xff09;2 高斯滤波器3 ViTPatch EmbeddingPosition EmbeddingTransformer Encoder完整的ViT模型 4 SE模块5 Dense Block6 Batch Normalization 1 点在多边形内&#xff08;point …

tinyid 教程_tinyid

软件简介tinyid 是滴滴开发的 id 生成器 分布式id生成系统&#xff0c;简单易用、高性能、高可用的id生成系统。提供的 REST API&#xff1a;nextId:curl http://localhost:9999/tinyid/id/nextId?bizTypetest&token0f673adf80504e2eaa552f5d791b644cresponse:{"data…

【推荐软件】wingrep

linux下搜索文本中的字符串时&#xff0c;习惯了find和grep的结合&#xff0c;很强大&#xff0c;但是windows下没有这两个命令&#xff0c;不用IDE编程时搜索略显不便。google一下&#xff0c;原来有wingrep工具可以用&#xff0c;可以实现相同的功能&#xff0c;来推荐一下给…

flash如何转html5,闪客精灵如何将Flash格式转换成HTML5

如何将Flash格式转换成HTML5?闪客精灵就是为Flash格式转换为HTML5而生的&#xff0c;他能够快速的将任何Flash文件&#xff0c;不管是SWF还是EXE格式的Flash格式转换成能被HTML5识别的HTML格式的文件。那么如何用闪客精灵将Flash格式转换为HTML5呢?下面是关于闪客精灵将Flash…

一壶 100℃ 的开水从多高倒进嘴里不会觉得烫?

全世界只有3.14 % 的人关注了爆炸吧知识先说结论&#xff1a;大约50米左右。 水从高空落下&#xff0c;先倒的水快&#xff0c;后倒的水慢&#xff0c;所以必然很快撕裂&#xff0c;成为细小的水滴。因此&#xff0c;这里就只讨论水滴的散热问题&#xff0c;而不考虑一大团水的…

Shell特殊变量

$ 表示当前Shell进程的ID&#xff0c;即pid $echo $$运行结果 2934特殊变量列表 变量含义$0当前脚本的文件名$n传递给脚本或函数的参数。n 是一个数字&#xff0c;表示第几个参数。例如&#xff0c;第一个参数是$1&#xff0c;第二个参数是$2。$#传递给脚本或函数的参数个数。…

当你的技术债务到期时,LinkedIn的故事 | IDCF

原文&#xff1a;https://www.linkedin.com/pulse/when-your-tech-debt-comes-due-kevin-scott/译者&#xff1a;冬哥那是 2011 年 10 月&#xff0c;就在 LinkedIn 上市后的第二次财报发布之前的几周。LinkedIn的业务做得很好&#xff0c;从任意可见角度来衡量&#xff0c;可以…

Libsvm分类步骤

1. 样本集的整理&#xff1a;提取特征&#xff0c;以LIBSVM指定格式存储。2. 特征的标准化处理&#xff1a;特征的缩放Scaling&#xff0c;避免量纲的影响。3. 选择合适的核函数类型4. 优选核函数的参数与C采用&#xff1a;交叉验证(或留一法)、grid-search5. 基于优选的参数&a…

ant vue 语言_Ant Design Vue是什么

Ant Design Vue 是蚂蚁金服 Ant Design 官方唯一推荐的Vue版UI组件库&#xff0c;组件的风格与Ant Design保持同步&#xff0c;组件的html结构和css样式也保持一致。Ant Design Vue 是遵循 Ant Design 的 Vue 组件库。是蚂蚁金服 Ant Design 官方唯一推荐的 Vue 版 UI 组件库&a…

再现神人!仅仅只花4天半就解开了史上最难密码,这下整个圈子都炸开了.........

全世界只有3.14 % 的人关注了爆炸吧知识鲁迅先生曾说&#xff0c;记录这东西&#xff0c;就是用来打破的。前阵子程序员圈子一定热呼的不可开交&#xff0c;咋回事&#xff1f;还不是因为有个程序员妹子捅出了一个大篓子。事情是这样的&#xff0c;在德国慕尼黑有一个名叫 Leah…

布鲁克大学计算机科学,布鲁克大学计算机科学本科.pdf

布鲁克大学计算机科学本科.pdf留学监理服务网布鲁克大学计算机科学 - Computer Science基本信息所属学校 布鲁克大学 - Brock University 所在院系 数学与科学学院 - 计算科学系专业名称 计算机科学 - Computer Science 学历层次 本科计算机与信息科学 计算与计算授予学位 计算…

HDU 1856 Brave Game(巴什博奕)

Brave Game Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3175 Accepted Submission(s): 2105 Problem Description十年前读大学的时候&#xff0c;中国每年都要从国外引进一些电影大片&#xff0c;其中有一部…

拥抱开源!除了微软红帽,这些国际大厂你认识几个?

在上世纪 90 年代&#xff0c;开源操作系统 Linux 出现时&#xff0c;有能力自行安装使用的用户并不多。因此&#xff0c;早期开源社区和开源软件厂商的一大工作就是向用户售卖书籍&#xff0c;提供初始的技术支持。比如基于 Linux 的内核&#xff0c;一批开源软件厂商开发出不…

J2EE第五课Servlet随课笔记

把上课笔记全上传到博客中&#xff0c;二原因&#xff1a; 1 方便自己以后查阅&#xff0c;看得多&#xff0c;记得多 2 提供一些笔记给刚学JAVA的朋友&#xff0c; 笔记&#xff1a; 1 1、什么是Servlet? 2 是运行于服务端&#xff08;java服务器&#xff09;的一个jav…

乒乓球单循环赛_乒乓球淘汰赛制和单循环赛制的比赛方法是什么?

展开全部一、乒乓球淘汰赛制比赛方法&#xff1a;1、32人先进行1轮淘汰赛&#xff0c;获胜的16人进入胜62616964757a686964616fe78988e69d8331333431363531者组&#xff0c;失败的16人进入败者组2、败者组第一轮&#xff1a;16人参赛&#xff0c;失败的8人被淘汰&#xff0c;胜…

详解Oracle DELETE和TRUNCATE 的区别

语法delete from aa truncate table aa 区别 1.delete from后面可以写条件&#xff0c;truncate不可以。2.delete from记录是一条条删的&#xff0c;所删除的每行记录都会进日志&#xff0c;而truncate一次性删掉整个页&#xff0c;因此日至里面只记录页释放&#xff0c;简言之…

湖南工业职业技术学院计算机协会,计算机网络协会

一、协会简介于2005年成立&#xff0c;系信息工程系直属协会。以学习网络知识理论及技术实践为主&#xff0c;以业余活动为辅的双向协会。由我系专业教研团队亲自授课教学&#xff0c;达到教学合一效果。注重培养高技能、高素质综合能力人才。二、协会宗旨以普及计算机基础知识…

浙大月赛C题(2012/8)Cinema in Akiba(线段树)

http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId4791 &#xff08;1&#xff09;第一次写浙大的题目&#xff0c;这题让我十分意外&#xff0c;基本的线段树类型&#xff08;求第x个空位&#xff09;。 &#xff08;2&#xff09;电影院里&#xff0c;一次…