5

我是 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 System Monitor中,我注意到我的应用程序使用的内存约为 1GB。而且它的大小似乎每 20 分钟翻一番。这是正常的吗,应用程序真的使用了那么多内存吗?我在这里错过了什么吗?

谢谢。

4

3 回答 3

19

如果你的程序经常分配和释放内存块,你就会得到碎片化——操作系统只能做很多事情来确保你分配的内存块之间没有间隙。但一般来说,由此产​​生的内存使用量将趋于平稳。

如果您的程序的内存不断增加,那么您就有了内存泄漏——或者您忘记了delete对象(或者free()在 C 风格分配的情况下调用),或者您在容器中累积对象并忘记删除它们。

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

使用 valgrind 检测内存泄漏就像使用你最喜欢的包管理器安装它然后运行一样简单

valgrind my_program

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

valgrind 很棒。

于 2012-04-27T01:59:31.910 回答
0

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

也许,如果您可以测量使用的内存增加了多少,以及数据结构的大小,您就会很好地提示问题出在哪里。

您每 20 分钟收到大约 600.000 条消息。如果内存使用量从 1GB 翻倍到 2GB,则每条消息会丢失 1.8kB(1GB / 600.000 条消息在 20 分钟内)

于 2012-04-29T20:46:04.403 回答
0

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

RSS(居民规模)是否在增加?还是 VSZ(虚拟大小)在增加?

你可以通过运行“ps -aux”找到

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

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

于 2018-02-01T23:57:18.363 回答