为什么我的C ++程序的内存使用量不断增长?

时间:2012-04-27 01:52:19

标签: c++ linux memory

我是Linux和C ++的新手,对我的应用程序的内存使用情况有疑问。

我的应用程序处理大量实时数据,每秒约 500 条消息。

我使用std :: map来管理(即插入和删除)所有消息。例如,

std::map<int, data_struct> m_map;

// when receive a new message, convert the message into a data structure
m_map.insert(std::pair<int, data_struct>(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分钟翻一番。这是正常的,应用程序真的使用了那么多内存吗?我在这里错过了什么吗?

感谢。

3 个答案:

答案 0 :(得分:17)

如果您的程序经常分配和释放内存块,则会得到fragemtation - 操作系统只能做很多事情来确保您分配的内存块之间没有间隙。但通常情况下,由此产生的内存使用量将达到稳定水平。

如果程序的内存不断增加,则会导致内存泄漏 - 要么忘记delete个对象(要么在C风格的情况下调用free()分配)或者您正在容器中累积对象并忘记删除它们。

要查找丢失的delete来电,请使用valgrind

使用valgrind检测内存泄漏就像使用您喜欢的包管理器安装它然后运行

一样简单
valgrind my_program

您的程序将运行,当它完成时,valgrind将转储一份非常详细的内存泄漏报告及其来源,包括完整的堆栈跟踪。

valgrind太棒了。

答案 1 :(得分:0)

map :: erase()调用你对象的析构函数方法,所以你应该在那里进行内存泄漏

也许,如果您可以测量已用内存的增加量以及数据结构的大小,您可以很好地了解问题所在。

每20分钟你会得到大约600,000条消息。如果内存使用量从1GB增加到2GB,则每条消息会丢失1.8kB(20分钟内1GB / 600.000条消息)

答案 2 :(得分:0)

嗯,内存使用量增加意味着不仅仅是泄漏。

RSS(居民规模)是否在增加? 要么 VSZ(虚拟大小)增加了吗?

您可以通过运行&#34; ps -aux&#34;

找到答案

我所经历的是,如果RSS保持不变并且VSZ不断增加,那么肯定是内存泄漏。

如果RSS不断增长并且你的VSZ在某个时刻稳定下来,那么你每次都会触及大量的内存,而且你正在增加你正在触摸的内存量,在你的代码中发现这一点很难。