マルチスレッドサーバープログラムでは、常駐メモリが1Gから20Gに増加し、ダウンしませんでした。私はメモリツールでチェックし、プログラムはメモリリークがありません。 私は多分glibc解放されたメモリを保持し、OSにリリースしなかったと思う。私はmunmapを呼び出すと、マップされたメモリはOSに戻りますが、私はまだ1日後に20Gのメモリを占有することを観察しています(mmapでallocを置き換えると、すべてのmmapは65-100kのメモリになります)。 私は知りたい:munmapは、マップされたメモリを間違いなくOSに返すだろうか? とその他のアドバイスはありますか? ありがとうございます。mmap小さいサイズのメモリ、munmapの場合、glibcはマップされたメモリをOSにリリースしますか?
2
A
答えて
2
はい、小規模な割り当て(< 128k、私が思い出したように)では、glibcは通常sbrk
を使用し、独自のフリーリストを維持します。より大きな割り当ての場合は、mmap()
とmunmap()
を使用します。
munmap
は確実にメモリをシステムに返します。これはシステムコールです。 glibcはそれをカーネルに渡します。
これはLinuxだと仮定すると、テストコードを書いてを実行してmmapの動作を確認することができます。PID
はプロセスのプロセスIDです。カーネルがあなたのプロセスのために維持している各仮想メモリ領域(VMA)の行のために印刷されます。基本的に各mmap()に対して1つです。
しかし、glibcがメモリをシステムに返さなくても、内部のフリーリストを使ってリサイクルします。 mmap()/ munmap()を使用しても何も変更されなかったという事実に加えて、おそらくあなたのプログラムにメモリリークがあったのでしょうか?
関連する問題
- 1. mmap/mprotect-readonlyゼロページはコミットされたメモリにカウントされますか?
- 2. のmmap()とと、munmap()
- 3. リンクされたリストの場合、 "オーバーヘッド"メモリは何を指していますか?
- 4. mmap()の配列またはmallocedメモリ
- 5. フックmmap/munmap without LD_PRELOAD
- 6. メモリを明示的にリリースしてもメモリが解放されない
- 7. MAP_NORESERVEのmmapは物理メモリを予約していますか?
- 8. C++のmmapメモリにファイルし、そのメモリに
- 9. c#.netメモリ間でマップされたファイル
- 10. マップされたメモリのビットにアクセスするには?
- 11. メモリにマップされたInputStreamをコンテンツプロバイダから返すか?
- 12. サイズを小さくしてglibcをビルドするには?
- 13. マップされたメモリのテキストファイルへの書き込みは、マップされたメモリの最後までNULLを出力します。
- 14. realloc()は古いメモリを解放します(古いメモリが他のメモリへのポインタである場合)?
- 15. ウィンドウのサイズが縮小された場合、IE divはそれに応じて縮小されません
- 16. ASP.NETはバンドルされたスクリプトをメモリに保存しますか?
- 17. アライメントされたメモリのプリフェッチ
- 18. Firebaseからダウンロードした画像は、サイズが200-400kbの場合、何とか28MBのメモリを占有します。
- 19. より良いまたは同じ:CPU memcpy()対CUDAの固定されたマップされたメモリのデバイスcudaMemcpy()
- 20. 他のオブジェクトが指し示されている場合は、本当にメモリを解放できますか?
- 21. glibcから正常に終了しました - malloc():メモリの破損
- 22. メモリとして渡されるベクトルのサイズを拡大する
- 23. チタン1.8は、リリース1.6と1.7のメモリ枯渇の問題から最後に解放されました
- 24. Javaでメモリ使用率の面でマップを使用した場合の短所
- 25. Python - ネストされた空のリストのメモリ内サイズ
- 26. mmapが失敗しました - GLエラー:メモリ不足
- 27. python2.7メモリ制限リリース
- 28. OSのメモリ分離
- 29. メモリがクローブされました
- 30. Javaはメモリを節約するためにスタックサイズを小さくします。
どのプラットフォームですか? –
@Ignacio: "glibc"とタグ付けされています。 glibcは答えが異なるプラットフォームをサポートしていますか? (OK、おそらく彼はそれを "linux"とタグ付けするべきです)。 – Nemo
munmapを使ってmmap経由で割り当てられたシステムにメモリを返し、10.5で発生しなかった10.6で大きなメモリリークが見られます。これは、10.6で行動の変化があったかどうか疑問に思います –