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();
}
}
}
阅读(234) | 评论(0) | 转发(0) |