1 现象:问题描述
执行OME消息跟踪功能,经过7~8小时的运行后,发现机器运行变慢,检查内存,发泄可用内存只有5M了。
使用purify工具测试,再次打开OME跟踪功能,发现了下面的语句不断出现内存泄露的情况:
2 关键过程:根本原因分析
根据purify测试中的情况,可以推断,本处语句是使得机器内存枯竭的原因:
switch(serviceType)
{
…//其它分支
case ome_remote_service_sipadapter:
{
temStr = CTraceImpl::g_pService->_bind_to_object(ome_setting::getServiceName(serviceType),*sip::ISIPAdapter::_desc());
}
break;
…//其它分支
}
_bind_to_object()函数是基础平台ENIP提供的函数,经过查询ENIP提供的手册,才知道使用_bind_to_object后不调用_narrow()或者addRef(),否则会出现内存泄露。
经过走查代码,发现调用_bind_to_object()函数后不调用_narrow或者addRef()的地方非常多,因此导致了内存的大规模泄露。
3 结论:解决方案及效果
解决方案:
根据ENIP提供的手册,对所有调用_bind_to_object()函数的地方,检查是否在后面调用了_narrow()或者addRef()函数,如果没有调用,则加上。
对于上面举例的内存泄露程序段,修改如下:
switch(serviceType)
{
…//其它分支
case ome_remote_service_sipadapter:
{
temStr = CTraceImpl::g_pService->_bind_to_object(ome_setting::getServiceName(serviceType),*sip::ISIPAdapter::_desc());
objVar = sip::ISIPAdapter::_narrow(temStr);
}
break;
…//其它分支
}
效果:
按照上面的方案修改后,再次使用purify工具测试OME消息跟踪功能,没有出现内存泄露,问题得到解决。
4 经验总结:预防措施和规范建议
对于第三方提供的库函数,需要仔细查看函数的使用手册,防止使用不当出现内存泄露。
5 备注
本问题出现在转测试阶段。
6 考核点
第三方库函数使用
7 试题
使用第三方库函数,正确的方式是:
(1)使用第三方库函数需要增加异常触及代码,应该捕获该库函数描述的所有可能的异常;
(2)使用第三方库函数后,程序可以运行即可;
(3)使用第三方库函数时,如果该函数名和参数可以看出使用的方法,就不需要看该函数的使用描述;
(4)对于使用第三方库时出现异常,可以使用捕获全部异常来屏蔽该异常。
(5)使用第三库函数出现在该函数中内存泄漏,就可以认为非调用者的问题。
答案:(1)
阅读(658) | 评论(0) | 转发(0) |