在多線程服務器程序中,我發現常駐內存從1G增加到20G,並沒有下降。我檢查了內存工具,程序沒有內存泄漏。 所以我想glibc可能會釋放內存,沒有釋放到操作系統。我用mmap替換alloc(一般來說,每個mmap都會應用65-100k內存),期望當我調用munmap時,映射內存將返回到操作系統,但是我觀察到運行1天后程序仍然佔用20G內存? 所以我想知道:munmap肯定會返回映射內存到操作系統? 等建議? 謝謝。當munmap是glibc時,mmap小內存將釋放映射內存到OS?
2
A
回答
2
是的,對於小分配(< 128k,我記得)glibc通常會使用sbrk
並保留自己的空閒列表。對於更大的分配,它將使用mmap()
和munmap()
。
munmap
肯定會將內存返回給系統。這是一個系統調用; glibc只是將它傳遞給內核。
假設這是Linux,您可以通過編寫一些測試代碼並執行cat /proc/PID/maps
來驗證mmap的行爲,其中PID
是進程的進程ID。它將爲每個虛擬內存區域(VMA)打印行列,內核爲您的進程維護;本質上,每個mmap()都有一個。
但是,即使glibc沒有將內存返回給系統,它也會通過自己的內部空閒列表回收它。鑑於此,再加上使用mmap()/ munmap()並沒有改變任何事實,您是否想過您的程序可能存在內存泄漏?
相關問題
- 1. 釋放內存映射內存
- 2. 內存映射
- 3. 正確釋放和取消內核內存映射
- 4. 調用clear後無序映射是否釋放內存?
- 5. mmap()在Linux內核中訪問未映射的內存
- 6. 將結構寫入映射的內存文件(mmap)
- 7. 當表格關閉時釋放內存
- 8. 當臨時對象的內存釋放
- 9. 釋放內存
- 10. 釋放內存
- 11. 當釋放內存中的內存時程序崩潰
- 12. mmap SIGSEGV當內存映射是一個類成員,並在類之外修改
- 13. 將文件映射到內存中
- 14. 無法將設備映射到內存
- 15. 內存映射UIImage
- 16. 釋放內存時崩潰
- 17. 何時會釋放內存?
- 18. confise何時釋放內存
- 19. 當直接映射緩存中存在偏移量時,如何將內存地址映射到塊?
- 20. 如何將內存映射到散列映射到文件
- 21. 當你有更少的可用內存時映射BAR中提到的內存
- 22. 緩存到內存的映射
- 23. 將內存映射到文件描述符(反向mmap)的系統調用?
- 24. ç釋放內存
- 25. 釋放ScrollView內存
- 26. QList內存釋放
- 27. JNI釋放內存
- 28. OpenCV釋放內存?
- 29. 與釋放內存
- 30. Javascript內存釋放
哪個平臺? –
@Ignacio:它被標記爲「glibc」。 glibc是否支持答案不同的任何平臺? (OK,所以他應該標記它爲「linux」。) – Nemo
我們使用munmap將內存返回到通過mmap分配的系統,並且在10.5中看到10.6中沒有發生的大內存泄漏。這讓我懷疑10.6中的行爲是否有變化 –