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#之异步导致内存泄漏相关推荐

  1. nstimer循环引用_解决NSTimer循环引用导致内存泄漏的六种方法

    demo放在了GitHub 内存泄漏的原因: self强引用timer.timer添加在runloop上,只要timer不销毁self就销毁不了.当然了你可以选择在viewWillDisappear中 ...

  2. 会不会导致内存泄漏_可能会导致.NET内存泄露的8种行为

    原文连接:https://michaelscodingspot.com/ways-to-cause-memory-leaks-in-dotnet/ 作者 Michael Shpilt.授权翻译,转载请 ...

  3. android 栏目编辑,android – 编辑文本导致内存泄漏

    介绍: 我有一个应用程序具有以下结构: ActionBar顶部(ActionBarSherlock) ViewPagerIndicator下面(对于选项卡) ViewPager(主机片段) 我有一个问 ...

  4. 使用智能指针错误导致内存泄漏_C++智能指针使用的那些事

    指针指针的由来 在C/C++里面,内存管理由开发者自己管理.指针变量总是指向一片内存空间,这片内存空间可以是局部变量.也可以是通过malloc.new申请的.如果申请的内存没有释放,就会导致内存泄漏. ...

  5. fastjson带泛型序列化导致内存泄漏

    fastjson带泛型序列化导致内存泄漏 一.背景 某日早上,生产环境告警群出现了大量响应时间在1s多的慢接口,在应用日志中也能找到不少接口超时熔断(响应时间>=5s). 当中有不少接口的SQL ...

  6. s5 android5.0内存泄漏,android-最初从位图泄漏了未引用的byte [],但被回收的()导致内存泄漏(直到活动停止)...

    我的位图内存泄漏导致内存不足.我在Android 5.0(Samsung S5)上运行了测试.我已经使用Android Studio(1.5.1 2.0.0预览版7)调查了此问题. HPROF内存转储 ...

  7. 动态内存分配导致内存泄漏之处

    摘要:举了几个动态内存分配过程中,发生内存泄漏的例子 1. 分配了内存,却没有及时删除,导致泄漏 1: void doSomething() 2: { 3: int *pnValue = new in ...

  8. 会不会导致内存泄漏_Java内存泄漏!为什么会泄漏?如何泄漏?怎么定位?

    JVM应该可以算Java中最为核心的部分了,其中开箱即用的内存管理又是JVM中的核心组成部分.我们都知道JVM的内存管理具有垃圾回收功能(Java Garbage Collector),编码时只需要n ...

  9. 发送队列积压导致内存泄漏

    导致Netty内存泄漏的原因很多,例如,使用内存池方式创建的对象忘记释放,或者系统处理压力过大导致发送队列积压. 尽管Netty 采用了NIO非阻塞通信,I/O处理往往不会成为业务瓶颈,但是如果客户端 ...

最新文章

  1. VTK:结构化网格之VisualizeStructuredGrid
  2. Python四大金刚
  3. 收银机服务器操作系统,第二章 超市收银机操作系统最终版.doc
  4. Zookeeper(一)——简介
  5. 三,linux系统的由来
  6. pat04-树4. Root of AVL Tree (25)
  7. 在visio里面插入带圆圈的数字字符
  8. 安卓设计模式のAdapter模式
  9. python表示倍数的英语句型_英语中“倍数表达法”和“长、宽、高句型”
  10. 贯彻落实83号文,超图“互联网+不动产”再升级
  11. hash与history 以及区别
  12. 威联通TS-453Bmini NAS加装内存,轻松玩转虚拟机安装win10系统
  13. 面试题——正则表达式
  14. OCR图片转文字两种python方法实现
  15. java提取word中的文字,java获取word里面的文本
  16. 2008年全国337个地级市GDP排名
  17. bzoj 4765: 普通计算姬
  18. 1、HotSpot And OpenJDK And OracleJDK And JER区别
  19. JavaScript起源及发展
  20. 大数据Hive(七):Hive的开窗函数

热门文章

  1. MINA,xSocket同样的性能缺陷及陷阱,Grizzly better
  2. C# Socket tcp 发送数据大小问题
  3. POJ-1163(DP,Water)
  4. Tech.ED 2009特别奉献:Windows 7解读
  5. django中处理表单实例
  6. Navicat-数据库管理工具
  7. 编写更加稳定、可读性强的JavaScript代码
  8. 机器学习--支持向量机(二)拉格朗日乘子法详解
  9. typeorm_如何评价TypeORM?
  10. python绘制曲线y=2x+5_使用python动态生成波形曲线的实现