mmap小尺寸内存,当munmap为glibc时,会将映射内存释放到操作系统

mmap small size memory, when munmap, is glibc will release mapped memory to OS?

本文关键字:内存 映射 操作系统 释放 mmap munmap glibc      更新时间:2023-10-16

在多线程服务器程序中,我发现驻留内存从1G增加到20G,并且没有下降。我用内存工具进行了检查,程序没有内存泄漏。所以我认为glibc可能释放了内存,没有释放到操作系统。我用mmap替换alloc(通常,每个mmap都会应用65-100k内存),预计当我调用munmap时,映射的内存会返回到OS,但我观察到程序运行1天后仍然占用20G内存?所以我想知道:munmap肯定会将映射的内存返回到操作系统吗?以及其他建议?非常感谢。

是的,对于小的分配(我记得是<128k),glibc通常会使用sbrk并维护自己的空闲列表。对于较大的分配,它将使用mmap()munmap()

munmap肯定会将内存返回给系统。这是一个系统调用;glibc只是将它传递给内核。

假设这是Linux,您可以通过编写一些测试代码并执行cat /proc/PID/maps来验证mmap的行为,其中PID是进程的进程ID。它将为内核为您的进程维护的每个虚拟内存区域(VMA)打印一行;本质上,每个mmap()一个。

然而,即使glibc不将内存返回给系统,它也会通过自己的内部空闲列表回收内存。考虑到这一点,再加上使用mmap()/munmap()并没有改变任何事情,你有没有想过你的程序可能存在内存泄漏?