mmap小型内存,当使用munmap时,glibc是否会将映射的内存释放到OS?

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

要回复问题请先登录注册