C 内存使用率不低于';免费电话不要减少

C 内存使用率不低于';免费电话不要减少,c,windows,memory,memory-management,operating-system,C,Windows,Memory,Memory Management,Operating System,我有一个使用C的WebSocket服务器,它将在Windows上作为后台进程运行。此进程将接受包含大型图像数据(base64格式)的请求 每次收到请求时,都使用malloc分配内存。并在请求执行后释放 但是当我检查任务管理器时,内存使用并没有减少。另外,当我发送另一个请求时,会分配额外的内存 我的问题是,为什么进程没有释放分配的内存或重用以前分配的内存?不同平台上的free的底层实现不同,但您看到的最有可能是由于延迟内存分配/释放。您的操作系统(或内存管理例程)知道您刚刚释放的内存,但由于您的程

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

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

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


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

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

如果您的程序释放并请求更多内存,则底层内存管理例程不必返回您释放的内存。组合空闲块被称为,这是一个昂贵的操作,因此它将被延迟到最后一刻,如果可能的话,根本不做


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

保留内存的决定可能在任务内存管理例程中,而不是操作系统。当我试图处理另一个请求(使用malloc)时,为什么内存使用量再次增加而不是使用空闲内存?@Ronnie:可能是因为空闲内存不够大——这是最常见的原因。也就是说,您释放了1个MiB,但下一个请求是1.2 MiB,并且还没有那么大的可用块,所以它分配了一个新的块。冲洗并重复。@Ronnie我编辑了我的答案(在中间)来回答这个问题。@Ronnie:好的。让我看看,你在用哪个系统?噢,窗户。我对Windows的了解还不够,无法帮助解决其内存分配系统的行为——无论是在o/s级别还是在C运行时库级别。原则上,它可以返回与释放的地址相同的地址。如果没有,可能有很好的理由,甚至可能会在某个地方记录下来(但我不知道在哪里)。例如,它可能决定分配一个大的块,然后围绕该大块循环,依次分配其中的部分。可能有其他内存分配导致碎片。那是什么Windows操作系统版本?我使用的是Windows 7 Ultimate