У меня была похожая проблема в моем приложении, после некоторого исследования я заметил, что по какой-то причине glibc не возвращает память системе, когда выделенные объекты малы (в моем случае менее 120 байт).
Посмотрите на этокод:
#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 МБ не возвращаются в систему.Когда я изменил 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