2011-06-18 72 views
2

在多線程服務器程序中,我發現常駐內存從1G增加到20G,並沒有下降。我檢查了內存工具,程序沒有內存泄漏。 所以我想glibc可能會釋放內存,沒有釋放到操作系統。我用mmap替換alloc(一般來說,每個mmap都會應用65-100k內存),期望當我調用munmap時,映射內存將返回到操作系統,但是我觀察到運行1天后程序仍然佔用20G內存? 所以我想知道:munmap肯定會返回映射內存到操作系統? 等建議? 謝謝。當munmap是glibc時,mmap小內存將釋放映射內存到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,您可以通過編寫一些測試代碼並執行cat /proc/PID/maps來驗證mmap的行爲,其中PID是進程的進程ID。它將爲每個虛擬內存區域(VMA)打印行列,內核爲您的進程維護;本質上,每個mmap()都有一個。

但是,即使glibc沒有將內存返回給系統,它也會通過自己的內部空閒列表回收它。鑑於此,再加上使用mmap()/ munmap()並沒有改變任何事實,您是否想過您的程序可能存在內存泄漏?