在多线程服务器程序中,我发现驻留内存从1G增加到20G,并没有下降。我检查了内存工具,程序没有内存泄漏。 所以我想也许glibc持有释放内存,没有释放到操作系统。我用mmap替换alloc(一般来说,每个mmap都会应用65-100 k的内存),期待当我调用munmap时,映射的内存将返回OS,但我观察程序在运行1天后仍占用20G内存? 所以我想知道:munmap肯定会将映射内存返回给操作系统? 和其他建议? 谢谢。
答案 0 :(得分:2)
是的,对于小分配(< 128k,我记得),glibc通常会使用sbrk
并维护自己的空闲列表。对于较大的分配,它将使用mmap()
和munmap()
。
munmap
肯定会将内存返回给系统。这是一个系统调用; glibc只是将它传递给内核。
假设这是Linux,您可以通过编写一些测试代码并执行cat /proc/PID/maps
来验证mmap的行为,其中PID
是您的流程的进程ID。它将为内核为您的进程维护的每个虚拟内存区域(VMA)打印行;基本上,每个mmap()一个。
但是,即使glibc没有将内存返回给系统,它也会通过自己的内部空闲列表进行回收。鉴于此,加上使用mmap()/ munmap()没有改变任何东西的事实,你是否想过你的程序可能有内存泄漏?