Chinaunix首页 | 论坛 | 博客
  • 博客访问: 567101
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 19:49:34

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) |
给主人留下些什么吧!~~