C#之异步导致内存泄漏
C#4.5的新特性,异步处理,同步的编码方式,大大的提高了编程效率。但是今天却由于异步的使用,导致了一个非常严重的内存泄漏。
崩溃截图:
由于本程序是用纯C#开发,不存在非托管内存,而且没有使用静态变量,为什么还是会有内存泄漏了。迷茫了一个上午。
快到中午的时候,一个偶然的机会,执行了异常清理,就是把异步等待进行超时处理之后,内存立马降下来了。
很快定位原因出在await一直没有得到应答上面。
通过研究发现,在调用await之后,系统会把await之前的函数变量都保存起来,等待应答到来之后,在恢复过来,然后好接下来处理。问题就出来这些函数变量上面。我有一个类需要保存起来,在应答回来之后使用。
var MediaRsp = await ryMedia.GetTcpAcceptAsync(sdp_Request.parameters.sessionId).ConfigureAwait(false);if(MediaRsp.Result == RyResult.Success){RailwaySend railwaySend = new RailwaySend(){Media = MediaRsp.media,SendType = SendType.RailWay,};session.AddSend(sdp_Request.parameters.sessionId, railwaySend);}
session类在另外一个线程一直在执行发送视频流的操作。
public void SendMedia(byte[] buffer)
{byte[] bSend = new byte[buffer.Length];Array.Copy(buffer, bSend, buffer.Length);
}
理论上讲,new的数据,是托管内存,应该会被Gcc回收,但是实际上没有。
结论:
await之前的涉及到的类,在await到达之前,所产生的托管内存都不会被Gcc回收。这就是导致最终内存泄漏的原因。
C#之异步导致内存泄漏相关推荐
- nstimer循环引用_解决NSTimer循环引用导致内存泄漏的六种方法
demo放在了GitHub 内存泄漏的原因: self强引用timer.timer添加在runloop上,只要timer不销毁self就销毁不了.当然了你可以选择在viewWillDisappear中 ...
- 会不会导致内存泄漏_可能会导致.NET内存泄露的8种行为
原文连接:https://michaelscodingspot.com/ways-to-cause-memory-leaks-in-dotnet/ 作者 Michael Shpilt.授权翻译,转载请 ...
- android 栏目编辑,android – 编辑文本导致内存泄漏
介绍: 我有一个应用程序具有以下结构: ActionBar顶部(ActionBarSherlock) ViewPagerIndicator下面(对于选项卡) ViewPager(主机片段) 我有一个问 ...
- 使用智能指针错误导致内存泄漏_C++智能指针使用的那些事
指针指针的由来 在C/C++里面,内存管理由开发者自己管理.指针变量总是指向一片内存空间,这片内存空间可以是局部变量.也可以是通过malloc.new申请的.如果申请的内存没有释放,就会导致内存泄漏. ...
- fastjson带泛型序列化导致内存泄漏
fastjson带泛型序列化导致内存泄漏 一.背景 某日早上,生产环境告警群出现了大量响应时间在1s多的慢接口,在应用日志中也能找到不少接口超时熔断(响应时间>=5s). 当中有不少接口的SQL ...
- s5 android5.0内存泄漏,android-最初从位图泄漏了未引用的byte [],但被回收的()导致内存泄漏(直到活动停止)...
我的位图内存泄漏导致内存不足.我在Android 5.0(Samsung S5)上运行了测试.我已经使用Android Studio(1.5.1 2.0.0预览版7)调查了此问题. HPROF内存转储 ...
- 动态内存分配导致内存泄漏之处
摘要:举了几个动态内存分配过程中,发生内存泄漏的例子 1. 分配了内存,却没有及时删除,导致泄漏 1: void doSomething() 2: { 3: int *pnValue = new in ...
- 会不会导致内存泄漏_Java内存泄漏!为什么会泄漏?如何泄漏?怎么定位?
JVM应该可以算Java中最为核心的部分了,其中开箱即用的内存管理又是JVM中的核心组成部分.我们都知道JVM的内存管理具有垃圾回收功能(Java Garbage Collector),编码时只需要n ...
- 发送队列积压导致内存泄漏
导致Netty内存泄漏的原因很多,例如,使用内存池方式创建的对象忘记释放,或者系统处理压力过大导致发送队列积压. 尽管Netty 采用了NIO非阻塞通信,I/O处理往往不会成为业务瓶颈,但是如果客户端 ...
最新文章
- VTK:结构化网格之VisualizeStructuredGrid
- Python四大金刚
- 收银机服务器操作系统,第二章 超市收银机操作系统最终版.doc
- Zookeeper(一)——简介
- 三,linux系统的由来
- pat04-树4. Root of AVL Tree (25)
- 在visio里面插入带圆圈的数字字符
- 安卓设计模式のAdapter模式
- python表示倍数的英语句型_英语中“倍数表达法”和“长、宽、高句型”
- 贯彻落实83号文,超图“互联网+不动产”再升级
- hash与history 以及区别
- 威联通TS-453Bmini NAS加装内存,轻松玩转虚拟机安装win10系统
- 面试题——正则表达式
- OCR图片转文字两种python方法实现
- java提取word中的文字,java获取word里面的文本
- 2008年全国337个地级市GDP排名
- bzoj 4765: 普通计算姬
- 1、HotSpot And OpenJDK And OracleJDK And JER区别
- JavaScript起源及发展
- 大数据Hive(七):Hive的开窗函数
热门文章
- MINA,xSocket同样的性能缺陷及陷阱,Grizzly better
- C# Socket tcp 发送数据大小问题
- POJ-1163(DP,Water)
- Tech.ED 2009特别奉献:Windows 7解读
- django中处理表单实例
- Navicat-数据库管理工具
- 编写更加稳定、可读性强的JavaScript代码
- 机器学习--支持向量机(二)拉格朗日乘子法详解
- typeorm_如何评价TypeORM?
- python绘制曲线y=2x+5_使用python动态生成波形曲线的实现