zoukankan      html  css  js  c++  java
  • 非托管资源内存泄露调测

    项目中某一识别引擎在并发720Vuser持续压测2d后挂起,
    控制台窗口报错“System.OutOfMemoryException.Exception”
    这里写图片描述
    原因分析:
    VSServer发生了隐式内存泄露且最大可能是非托管资源内存泄露。
    验证方法:
    (1)使用CLRProfiler内存泄露调试工具进行调测,发现一个问题:传入同样的参数,调用语音识别接口(SpeechServer.aspx),如此尝试10次,发现每次调用成功后,打开句柄数为318,销毁或已关闭的句柄数为25,存活或未关闭的句柄数为293,即未关闭的句柄占总句柄数92%,如下图所示:
    这里写图片描述
    初步怀疑内存泄露是由于句柄泄露导致的。为了验证该问题,测试策略如下:
    模拟并发40用户持续压测,分别监控VSServer.exe的线程数和句柄数及其内存消耗,测试结果如下图所示:
    这里写图片描述
    从图上看,线程数未增加,基本呈直线型。句柄数一开始直线上升,然后由于句柄的销毁与打开呈锯齿型,然后压测结束后句柄数曲线没有下降趋势,可以说明VSServer存在句柄泄露。
    但从.NET应用程序内存泄露类型角度讲,该内存泄露表现为非托管内存发生泄漏,即使用完非托管资源时未做显式的资源释放,如下图所示:
    这里写图片描述
    所以有两点是值得肯定的:
    (1)VSServer泄露是由于句柄泄露导致
    (2)句柄泄露表现为非托管资源内存泄露
    解决方案:
    为此在VSServer运行中使用CLRProfiler监控,同样做了10次统计,每次表现出存在如图所示函数调用过程中有未关闭的句柄,其中WriteLine()函数结束后未关闭的句柄数占90%以上,修改WriteLine()函数中文件流未彻底关闭问题。
    这里写图片描述

  • 相关阅读:
    [纯C#实现]基于BP神经网络的中文手写识别算法
    【转载】Jedis对管道、事务以及Watch的操作详细解析
    redis 缓存用户账单策略
    redis 通配符 批量删除key
    explain分析sql效率
    mysql 常用命令大全
    【转载】实战mysql分区(PARTITION)
    mysql表名忽略大小写配置
    【转】微服务架构的分布式事务解决方案
    【转载】Mysql中的Btree与Hash索引比较
  • 原文地址:https://www.cnblogs.com/qwop/p/6637380.html
Copyright © 2011-2022 走看看