非托管资源内存泄露调测

原文地址为: 非托管资源内存泄露调测

项目中某一识别引擎在并发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()函数中文件流未彻底关闭问题。
这里写图片描述


转载请注明本文地址: 非托管资源内存泄露调测

猜你喜欢

转载自blog.csdn.net/wcqlwyt/article/details/80854100