通过 mmap 分配的内存没有 munmap 会在进程退出或终端后导致泄漏
Mem alloced via mmap without munmap will cause leak after process exits or terminals
有通过mmap分配内存的代码
void *ret = mmap(NULL, 4 * 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
当进程正常退出时,内存会是return到os ?
根据man和unmap
下:
The region is also automatically unmapped when the process is
terminated.
这听起来很合理,因为内存被添加到虚拟内存中的进程页面,虚拟内存在终止时被释放。
Opengroup 未就此主题发表任何言论。
如果系统没有释放内存您可以尝试设置一个 at_exit 来清除任何仍然有效的分配内存映射,如果您能找到指向它的指针的话。
我刚刚发现了困难的方法,如果进程 没有 终止,只是 keeps 在 运行 上。
事后看来,这似乎很明显。
在连续几天调查内存泄漏时,我现在意识到我不应该完全依赖 Valgrind 来查找原因。当 Valgrind 报告根本没有泄漏时,我惊呆了,而我只能看到 ps 报告的 VSZ 部分关于我的进程稳步增加。
然后在拼命地谷歌搜索之后,最终一句话 here 让我走上了正确的轨道:
If your program is in a steady state but your VSZ keeps increasing, you have some sort of allocation leak. It may not strictly be a memory leak; you might be forgetting to unmap files or unload dynamically loaded code or something.
并且如 中明确所述,Valgrind 不报告 mmap() 泄漏。
有通过mmap分配内存的代码
void *ret = mmap(NULL, 4 * 1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
当进程正常退出时,内存会是return到os ?
根据man和unmap
下:
The region is also automatically unmapped when the process is terminated.
这听起来很合理,因为内存被添加到虚拟内存中的进程页面,虚拟内存在终止时被释放。
Opengroup 未就此主题发表任何言论。
如果系统没有释放内存您可以尝试设置一个 at_exit 来清除任何仍然有效的分配内存映射,如果您能找到指向它的指针的话。
我刚刚发现了困难的方法,如果进程 没有 终止,只是 keeps 在 运行 上。 事后看来,这似乎很明显。
在连续几天调查内存泄漏时,我现在意识到我不应该完全依赖 Valgrind 来查找原因。当 Valgrind 报告根本没有泄漏时,我惊呆了,而我只能看到 ps 报告的 VSZ 部分关于我的进程稳步增加。
然后在拼命地谷歌搜索之后,最终一句话 here 让我走上了正确的轨道:
If your program is in a steady state but your VSZ keeps increasing, you have some sort of allocation leak. It may not strictly be a memory leak; you might be forgetting to unmap files or unload dynamically loaded code or something.
并且如