c - 调用 free 后内存使用量不会减少

标签 c windows memory memory-management operating-system

我有一个使用 C 的 WebSocket 服务器,它将在 Windows 上作为后台进程运行。并且这个过程将接受包含大图像数据(base64 格式)的请求。

每次收到请求时,都会使用 malloc 分配内存。并在请求执行后释放。

但是当我检查任务管理器时,内存使用并没有减少。此外,当我发送另一个请求时,会分配额外的内存。

我的问题是,为什么进程没有释放分配的内存或者重新使用之前分配的内存?

最佳答案

free 的底层实现在不同平台上有所不同,但您所看到的很可能是由于惰性 内存分配/取消分配。您的操作系统(或内存管理例程)知道您刚刚释放的内存,但由于您的程序很可能会再次请求更多内存,因此在其他进程请求之前,它不会费心让其他进程可以使用该内存它。因此,任务管理器显示尽管调用了 free,但您的程序的内存使用量并没有减少。

如果您的程序释放然后请求更多内存,则底层内存管理例程不必将释放的内存还给您。组合空闲 block 称为 coalescing , 并且是一个代价高昂的操作,所以会拖到最后一刻,可能的话根本不做。

为了证明这一点,您可以启动另一个程序,并让它请求大量内存 - 如果您的原始程序正确释放了内存,那么一旦新程序请求内存,它的内存使用率就会下降。

关于c - 调用 free 后内存使用量不会减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47384177/

相关文章:

c++ - 传递一个函数和一个整数的函数。警告 : passing argument of "" from incompatible pointer type

c++ - 启用和禁用 USB 端口

C++ 实例化新对象导致相同的 "this"指针

c# - Vs2019 无法运行 NUnit 测试 - 'testhost.x86.exe' 问题

windows - 在Julia和Windows中设置PGFPlot

c++ - 我无法动态声明 vector 数组

ios - 关于应用程序的内存布局和一些变量的逻辑地址

c - 从 void 指针访问结构成员时遇到问题。

c - 按列打印 AVL 树

C 编程 - 释放一个用单引号填充的字符 ** 和用双引号填充的字符之间的区别 - valgrind