【问题标题】:memory leak disappears when using valgrind使用 valgrind 时内存泄漏消失
【发布时间】:2019-11-23 14:25:17
【问题描述】:

我们有一个复杂的算法,它处理 OpenCV 图像,从而分配和释放几 GB 的内存,主要是 cv::Mat,每个大小约为 10MB。如果我们在 valgrind 下迭代运行(使用 --tool=massif 或 --tool=memcheck),每次迭代后内存占用量返回相同的值(+-1MB),并且没有发现明显的内存泄漏。通过 ps 或 pmap 从外部观看或通过 /proc/self/status 从内部观看也显示最大 2.3GB 的占用空间没有增加。

但是,如果我们在没有 valgrind 的情况下运行相同的软件,那么内存占用量(通过 ps 或 pmap 从外部检查或通过 /proc/self/status 从内部检查)随着每次迭代而增加大约数百 MB,很快达到 5BG几次迭代。

因此,我们有一些看起来像是内存泄漏的东西,但 valgrind 无法帮助找到原因。 这可能是什么?

(这是Ubuntu下的C++)。

【问题讨论】:

  • 随着堆空间的增长,程序会向操作系统请求页面。当内存返回到堆时,堆不会将页面返回给操作系统。相反,它使用这些页面来满足后续的内存请求。
  • @Eljay 不应该增长,但如果每次迭代都清理资源
  • 你在使用 OpenCV 的 CUDA 吗?
  • 这里没有使用 CUDA
  • 可能是堆碎片?尝试使用例如在每次迭代后报告堆状态商城信息。您也可以尝试其他 malloc 库,例如 tcmalloc(它们有自己的方式来报告堆状态)。

标签: c++ valgrind


【解决方案1】:

感谢@phd 的评论,我找到了解决问题的方法:使用 tcmalloc 显着减少了内存占用(使用 2.5GB 而不是 6GB)。见附图

RSS memory using different malloc libraries

tcmalloc 或 jemalloc 的内存使用量似乎仍然略有增加,但至少对于我们通常拥有的迭代次数来说还可以。

仍然想知道 malloc 怎么会浪费这么多资源。我试图用 malloc_info() 找出答案,但没有成功。我怀疑内存碎片和/或多线程在这里发挥了作用。

【讨论】:

    猜你喜欢
    • 2013-06-24
    • 2017-08-13
    • 2020-03-31
    • 2016-03-15
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多