【问题标题】:Memory usage doesn't decrease upon calling free调用 free 时内存使用量不会减少
【发布时间】:2018-05-03 05:01:51
【问题描述】:

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

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

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

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

【问题讨论】:

  • 那是什么 Windows 操作系统版本?
  • 我使用的是 Windows 7 Ultimate

标签: c windows memory memory-management operating-system


【解决方案1】:

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

如果您的程序释放然后请求更多内存,则底层内存管理例程不必归还您释放的相同内存。合并空闲块称为coalescing,是一项昂贵的操作,因此会延迟到最后一刻,如果可能的话根本不做。

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

【讨论】:

  • 保留内存的决定可能是在任务中的内存管理例程中,而不是操作系统。
  • 当我尝试处理另一个请求(使用 malloc)时,为什么内存使用量再次增加,而不是使用释放的内存?
  • @Ronnie:可能是因为释放的内存不够大——这是最常见的原因。也就是说,您释放了 1 MiB,但下一个请求是 1.2 MiB,并且还没有那么大的可用块,因此它分配了一个新块。冲洗并重复。
  • @Ronnie 我编辑了我的答案(在中间)来回答这个问题。
  • @Ronnie:好的。让我们看看,你在哪个系统上工作?哦,窗户。我对 Windows 的了解还不够,无法帮助处理其内存分配系统的行为——无论是在 o/s 级别还是 C 运行时库级别。原则上,它可能返回与被释放的地址相同的地址。如果没有,可能有充分的理由,甚至可能记录在某处(但我不知道在哪里)。例如,它可能决定分配一个大块并循环围绕该大块分配它的部分。可能还有其他内存分配导致碎片。
猜你喜欢
  • 2021-07-18
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
相关资源
最近更新 更多