アプリで同様の問題が発生しました。いくつかの調査の後、割り当てられたオブジェクトが小さい場合 (私の場合は 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