【发布时间】: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(它们有自己的方式来报告堆状态)。