使用Valgrind时内存泄漏消失

memory leak disappears when using valgrind

本文关键字:泄漏 消失 内存 Valgrind 使用      更新时间:2023-10-16

我们有一个复杂的算法,它处理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++(。

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

使用不同 malloc 库的 RSS 内存

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

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