找出消耗内存的位置

时间:2012-07-03 11:01:10

标签: c++ memory memory-leaks memory-profiling

我有这个相对较大的数字应用程序代码可能会运行几天并最终吐出一些数字。整个过程都是用C ++编写的,利用了一堆第三方库,并使用GCC 4.6进行编译。该代码始终使用共享指针。

不幸的是,随着时间的推移,代码的内存消耗会增加,直到所有(共享)内存用完为止,然后崩溃。从算法上讲,代码不应该随着时间的推移积累内存,因此某处会出现错误。

我确实通过valgrind的泄漏检查器运行了一个小例子,它报告说一切都应该没问题。我的想法是,可能无意中在某个地方创建了共享指针,防止不必要的数据被释放(但这只是猜测)。

在一天结束时,我已经没有想法如何调试这样的事情了。 有什么想法吗?

3 个答案:

答案 0 :(得分:3)

由于您已经有valgrind工具套件,我建议您运行 massif 工具。

Massif将跟踪内存分配来源,报告将指示每个分配站点/功能创建的字节数。这将有助于您了解内存爆炸的来源。

答案 1 :(得分:1)

GNU libstdc ++默认缓存与STL相关的内存分配,显然是出于微基准速度的原因。但是,当使用tcmalloc和jemalloc等分配器时,实际效果对于速度和内存占用都会非常不利。 tcmalloc通过在环境中设置GLIBCPP_FORCE_NEW = 1和GLIBCXX_FORCE_NEW = 1来禁用此行为(分别用于libstdc++版本3.3和3.4),但我知道没有其他分配器这样做。因此,在启动应用程序时,通常最好设置适当的环境变量。

答案 2 :(得分:0)

即使您没有泄漏,也可能面临内存碎片。

如果您使用的是Linux,我建议尝试使用jemalloc分配器。它在Linux上运行良好。它运行在许多体系结构上,我甚至在zLinux上成功使用它(在IBM zSeries大型机上)。它非常易于使用 - 您甚至不需要重建您的应用程序或任何库,只需构建jemalloc并使用LD_PRELOAD设置启动您的应用程序:LD_PRELOAD=/usr/lib/libjemalloc.so <app>