Cプログラミング言語では、通常、メモリを手動で管理します。典型的なヒープ割り当ては、mallocへの呼び出しとそれに続くfreeへの呼び出しです。C ++では、より多くのオプションがありますが、内部では同じルーチンです。
// allocate N kB
data = malloc(N*1024);
// do something with the memory
// ...
// release the memory
free(data);
プログラムが開始されたばかりでNの値が大きい場合、mallocを呼び出すと、メモリ使用量が約Nキロバイト増加するのは当然のことです。そして確かに、それは事実です。
では、「free」を呼び出した後のプロセスのメモリ使用量はどのくらいですか?Nバイトはシステムに戻りましたか?
答えは、一般的にはそうではないということです。Linuxで、Nキロバイトを割り当てて解放する小さなプログラムを作成しました。次に、freeの呼び出し後にRAM使用量を測定します。正確な結果は、システムや標準ライブラリなどによって異なりますが、結果を例として示します。
表からわかるように、メモリが解放されることがありますが、私のテストでは30MBを超える大きなブロックである場合に限ります。このような場合、別のコードパスが使用されている可能性があります(たとえば、mmap、munmapの呼び出し)。それ以外の場合、プロセスはそのメモリを保持し、システムに再度解放することはありません。
|要求されたメモリ|空き後のメモリ使用量|
|::|::|
|1 kB|630 kB|
|100 kB|630 kB|
|1000 kB|2000 kB|
|10,000 kB|11,000 kB|
|20,000 kB|21,000 kB|
|30,000 kB|31,000 kB|
|40,000 kB|1,200 kB|
|50,000 kB|1,300 kB|
|100,000 kB|1,300 kB|
もちろん、メモリをシステムに強制的に解放する方法はありますが(たとえば、malloc_trimが役立つ場合があります)、デフォルトで解放されるとは期待しないでください。
私はC / C ++を参照として使用していますが、まったく同じ効果が幅広いプログラミング言語で発生する可能性があります。
影響は何ですか?
• プロセスが使用するメモリの量を使用して、データ構造のメモリ使用量を簡単に測定することはできません。
• 現在データを保持していないプロセスが大量のメモリを使用しているように見えるのは簡単です。
さらに読む: glibcmallocの非効率性
英語原稿:https://lemire.me/blog/2020/03/03/calling-free-or-delete/