mmap小尺寸内存,当munmap为glibc时,会将映射内存释放到操作系统
mmap small size memory, when munmap, is glibc will release mapped memory to OS?
在多线程服务器程序中,我发现驻留内存从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()并没有改变任何事情,你有没有想过你的程序可能存在内存泄漏?
相关文章:
- 添加静态constexpr成员是否会更改结构/类的内存映射
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 字符串共享内存映射的向量
- 确保内存映射页位于内存中
- 我可以将新的 std::tuple 放入内存映射区域,并在以后读回吗?
- 内存映射文件访问非常慢
- 内存映射C++中的流数据
- 我正在尝试创建一个C++映射,该映射在boost内存映射文件中具有向量值
- 内存映射区域初始数据
- 内存映射 IO 概念详细信息
- 为什么 du -sh 输出错误大小的内存映射文件
- 您可以将C 对象映射到内存映射的外围设备吗?
- 将 Android 内存映射到具有零拷贝的 GraphicBuffer
- 在内存映射时写入内存映射的文件
- 如何使用 Boost 内存映射解析 C++ 中的 CSV?
- Growing Boost.使用单个写入器的进程间内存映射文件
- 调整窗口内存映射文件的大小,而不会使指针失效
- Winapi:是否需要在可执行内存映射的文件上调用FlushInstructionCache
- 与从C++到C#的内存映射文件共享链式结构
- 在 C++ 和 C# 之间共享内存映射文件结构