【问题标题】:How to debug high memory consumption如何调试高内存消耗
【发布时间】:2015-07-24 13:25:03
【问题描述】:

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

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

我做了一些实验,结果如下:

  1. 此问题仅发生在 Linux(Ubuntu 14.04、OpenCV 3.0)上,不会发生在 Windows 上。
  2. 我用valgrind检查,程序没有内存泄漏。

这是这个类的代码: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内存)

编辑2: 我用tcmalloc替换了g++的内存分配器,然后问题就莫名其妙的消失了。

【问题讨论】:

  • 你是如何测量内存消耗的?
  • 调试的一个建议是编写一个内存查询类,为您提供 PSS 或 RES 或 VIRT 内存。你可以在每个块之后使用这个查询类的一个对象,看看内存在哪里增加。
  • gnome-system-monitor
  • 有时出于性能考虑,c++ 中的 lib 不会将内存释放回操作系统。
  • @SatishChalasani 当我只使用一个实例时,内存消耗会暂时上升到大约 600MB,但最终会减少到 50MB。因此,我认为 OpenCV 使用这些内存来解析 xml 文件。但是为什么当我在实例上使用时它会返回内存,而当我使用多个时它不会返回内存~~

标签: c++ debugging opencv memory


【解决方案1】:

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

【讨论】:

  • 如果内存分配可能发生在第三方库中是否有效?就我而言,内存可能由 OpenCV 分配。
  • @delphifirst 是的,除非他们使用自己的内存分配器(这不太可能)。
  • @Aaronl 我听从了你的建议,使用了tcmalloc,然后神秘的事情发生了:问题消失了……
猜你喜欢
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 2014-01-10
  • 2021-11-20
  • 2021-01-10
  • 2019-02-24
相关资源
最近更新 更多