我们有一个复杂的算法,该算法处理OpenCV图像,从而分配和释放数GB的内存,其中大部分都是cv :: Mat,每个内存约10MB。如果我们迭代地运行此valgrind(使用--tool = massif或--tool = memcheck),则每次迭代后内存占用量将返回相同的值(+ -1MB),并且不会发现明显的内存泄漏。通过ps或pmap从外部观看,或通过/ proc / self / status从内部观看,最大占用空间为2.3GB,并且没有增加。
但是,如果我们运行相同的软件但没有valgrind,那么每次迭代都会增加大约数百MB的内存空间(通过ps或pmap从外部检查,或者通过/ proc / self / status从内部检查),经过几次迭代后很快达到5BG迭代。
因此,我们有些东西看起来像是内存泄漏,但是valgrind对找到原因没有帮助。这可能是什么?
((这是Ubuntu下的C ++)。
感谢@phd的评论,我找到了解决问题的方法:使用tcmalloc可以显着减少内存占用(使用2.5GB而不是6GB)。见所附的grafic
RSS memory using different malloc libraries
[tcmalloc或jemalloc似乎仍然稍微增加了内存使用量,但是对于我们通常拥有的迭代次数来说至少可以。
仍然想知道malloc如何浪费这么多资源。我尝试使用malloc_info()进行查找,但是没有成功。我怀疑内存碎片和/或多线程在这里起作用。