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

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 19:04:36

1 现象:问题描述
某进程内存增长迅速,检测脚本及时发现,重启进程后,打印了CPU和内存增长信息的大量信息如下:
23:28:16 5.3% 257M 248M
23:28:26 11% 297M 284M
23:28:36 18% 419M 397M
23:28:47 22% 555M 522M
可以看到每隔10秒,内存增长100多M;
内存增长很快,且不断增长,导致不能处理其他网元发过来的消息,业务中断。
2 关键过程:根本原因分析
仔细走读代码,CRadiusPacket::Serialize在调用pAttribute->Serialize时没有判断返回值,当pAttribute->的m_bLength为0时,会引起wLength永远大于2,陷入死循环,不断的new内存。相关代码如下:
void CRadiusPacket::Serialize(TStream* pStream)
{………………
        while (wLength > 2)
        {
            TRadiusAttribute* pAttribute = NULL;
            NEW(pAttribute, TRadiusAttribute);
            if (NULL == pAttribute)
            {
                WrLog(Error, "Serialize: memory alloc failure!");
                return;
            }
            pAttribute->Serialize(pStream);
            AttributeGrid::iterator iter = m_Attributesgrid.find(pAttribute->m_bCode);
            if (iter != m_Attributesgrid.end())
            {
                //找到了重复的值
                (*iter).second.push_back(pAttribute);
            }
            else
            {
                //没找到
                AttributeArray array;
                array.push_back(pAttribute);
                AttributeGrid::value_type value(pAttribute->m_bCode, array);
                if (True != m_Attributesgrid.insert(value).second)
                {
                    //写失败
                    DELETE(pAttribute);
                }
            }
            wLength -= pAttribute->GetAllFieldLength();
        }
    }
}
阅读(206) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~