如何调试高内存消耗

时间:2015-07-24 13:25:04

标签: c++ debugging opencv memory

我写了一个程序,它使用OpenCV持久性模块来读取.xml.gz文件。我用一个类来管理这些数据。在构造函数中,它使用cv::FileStorage读取所有数据。所有数据都在成员变量中,可以是std::vectorcv::Mat。在类的每个实例之间没有静态成员或任何共享。

这是奇怪的事情。如果我只使用我的类的一个实例,程序将消耗大约50MB的内存。但是,如果我使用两个实例,它将消耗大约600MB。如果我使用三个,它将消耗大约650MB。如果我使用四个,它将消耗大约700MB ......在一个实例和多个实例之间似乎有一条奇怪的界限。

我做了一些实验,这里有一些结果:

  1. 此问题仅发生在Linux(Ubuntu 14.04,OpenCV 3.0)上,而不是在Windows上。
  2. 我使用valgrind进行检查,程序中没有内存泄漏。
  3. 以下是此课程的代码:https://github.com/delphifirst/FaceX/blob/master/FaceX/face_x.cpp

    在我的代码中指出问题或者给我一些调试这类问题的建议都会非常有帮助。

    编辑: 我按照注释中的建议,并使用top -p而不是gnome-system-monitor来检查内存消耗。结果是: VIRT:1003552,RES:693228,SHR:8440,%MEM:33.8(计算机总共有2GB内存)

    EDIT2: 我使用tcmalloc替换g ++的内存分配器,然后问题神秘地消失了。

1 个答案:

答案 0 :(得分:0)

您可以链接到tcmalloc(将替换程序中常用内存分配例程的内存分配库)并使用其堆分析器。堆分析器将告诉您内存消耗的来源(即程序中的哪些函数正在分配所有内存)。这应该为您提供进一步调试的良好起点。