我有一个使用C的WebSocket服务器,它将在Windows上作为后台进程运行。此过程将接受包含大图像数据(base64格式)的请求。
每次收到请求时,都会使用malloc分配内存。请求执行后免费。
但是当我检查任务管理器时,内存使用量没有减少。此外,当我发送另一个请求时,会分配额外的内存。
我的问题是,为什么进程没有释放分配的内存或重用以前分配的内存?
答案 0 :(得分:4)
free
的底层实现在不同平台上有所不同,但您目击的很可能是由于 lazy 内存分配/释放。您的操作系统(或内存管理例程)知道您刚刚释放的内存,但由于您的程序可能会再次请求更多内存,因此在其他进程请求之前,它不会将该内存提供给其他进程它。因此,任务管理器显示您的程序的内存使用量不会减少,尽管调用免费。
如果您的程序释放然后请求更多内存,则底层内存管理例程不必返回您释放的相同内存。组合空闲块称为coalescing,这是一项昂贵的操作,因此它将延迟到最后一刻,如果可能的话,根本不会完成。
为了证明这一点,你可以启动另一个程序,并让它请求大量的内存 - 如果你的原始程序正确释放了内存,一旦新程序请求内存,它的内存使用率就会下降。