我在我的应用程序中遇到了类似的问题,经过一番调查,我注意到由于某种原因,当分配的对象很小(在我的情况下小于 120 字节)时,glibc 不会将内存返回给系统。
看看这段代码:
#include <list>
#include <malloc.h>
template<size_t s> class x{char x[s];};
int main(int argc,char** argv){
typedef x<100> X;
std::list<X> lx;
for(size_t i = 0; i < 500000;++i){
lx.push_back(X());
}
lx.clear();
malloc_stats();
return 0;
}
程序输出:
Arena 0:
system bytes = 64069632
in use bytes = 0
Total (incl. mmap):
system bytes = 64069632
in use bytes = 0
max mmap regions = 0
max mmap bytes = 0
大约 64 MB 不会返回系统。当我将 typedef 更改为:
typedef x<110> X;
程序输出如下所示:
Arena 0:
system bytes = 135168
in use bytes = 0
Total (incl. mmap):
system bytes = 135168
in use bytes = 0
max mmap regions = 0
max mmap bytes = 0
几乎所有的内存都被释放了。我还注意到,malloc_trim(0)
在任何一种情况下都使用释放内存到系统。
这是添加malloc_trim
到上面的代码后的输出:
Arena 0:
system bytes = 4096
in use bytes = 0
Total (incl. mmap):
system bytes = 4096
in use bytes = 0
max mmap regions = 0
max mmap bytes = 0