我是Linux和C的新手,对我的应用程序的内存使用情况有疑问.
我的应用程序处理大量实时数据,每秒约500条消息.
我使用std :: map来管理(即插入和擦除)所有消息.例如,
std::map m_map;
// when receive a new message, convert the message into a data structure
m_map.insert(std::pair(message.id, data));
// when need to erase a message
iter = m_map.find(id);
if (iter != m_map.end()) {
m.map.erase(iter);
}
m_map的大小大约是2500,即,应用程序在开始时接收很多新消息,然后逐渐需要擦除消息.大约10秒后,它达到了一个点,即收到的新消息数与需要删除的消息大致相同.
我的问题是,大约20分钟后,在Linux系统监视器中,我注意到我的应用程序使用的内存大约是1GB.而且看起来每20分钟翻一番.这是正常的,应用程序真的使用了那么多内存吗?我在这里错过了什么吗?
谢谢.
解决方法:
如果您的程序经常分配和释放内存块,那么您将得到fragemtation – 操作系统只能做很多事情来确保您分配的内存块之间没有间隙.但一般来说,由此产生的内存使用量将达到稳定水平.
如果程序的内存不断增加,则会出现内存泄漏 – 要么忘记删除对象(或者在C风格分配的情况下调用free()),要么将对象累积到容器中而忘记删除它们.
要查找丢失的删除呼叫,请使用valgrind!
使用valgrind检测内存泄漏就像使用您喜欢的包管理器安装然后运行一样简单
valgrind my_program
您的程序将运行,当它完成时,valgrind将转储一份非常详细的内存泄漏报告及其来源,包括完整的堆栈跟踪.
valgrind太棒了.
标签:c-2,linux,memory
来源: https://codeday.me/bug/20190712/1444419.html