2011-06-18 14 views
2

マルチスレッドサーバープログラムでは、常駐メモリが1Gから20Gに増加し、ダウンしませんでした。私はメモリツールでチェックし、プログラムはメモリリークがありません。 私は多分glibc解放されたメモリを保持し、OSにリリースしなかったと思う。私はmunmapを呼び出すと、マップされたメモリはOSに戻りますが、私はまだ1日後に20Gのメモリを占有することを観察しています(mmapでallocを置き換えると、すべてのmmapは65-100kのメモリになります)。 私は知りたい:munmapは、マップされたメモリを間違いなくOSに返すだろうか? とその他のアドバイスはありますか? ありがとうございます。mmap小さいサイズのメモリ、munmapの場合、glibcはマップされたメモリをOSにリリースしますか?

+0

どのプラットフォームですか? –

+0

@Ignacio: "glibc"とタグ付けされています。 glibcは答えが異なるプラットフォームをサポートしていますか? (OK、おそらく彼はそれを "linux"とタグ付けするべきです)。 – Nemo

+0

munmapを使ってmmap経由で割り当てられたシステムにメモリを返し、10.5で発生しなかった10.6で大きなメモリリークが見られます。これは、10.6で行動の変化があったかどうか疑問に思います –

答えて

2

はい、小規模な割り当て(< 128k、私が思い出したように)では、glibcは通常sbrkを使用し、独自のフリーリストを維持します。より大きな割り当ての場合は、mmap()munmap()を使用します。

munmapは確実にメモリをシステムに返します。これはシステムコールです。 glibcはそれをカーネルに渡します。

これはLinuxだと仮定すると、テストコードを書いてを実行してmmapの動作を確認することができます。PIDはプロセスのプロセスIDです。カーネルがあなたのプロセスのために維持している各仮想メモリ領域(VMA)の行のために印刷されます。基本的に各mmap()に対して1つです。

しかし、glibcがメモリをシステムに返さなくても、内部のフリーリストを使ってリサイクルします。 mmap()/ munmap()を使用しても何も変更されなかったという事実に加えて、おそらくあなたのプログラムにメモリリークがあったのでしょうか?

関連する問題