【问题标题】:Will process's RES memory drop after memory freed?内存释放后进程的RES内存会下降吗?
【发布时间】:2018-05-10 12:40:49
【问题描述】:

我有一个进程不断分配内存,并在另一个线程处理完相关数据后释放它。当数据处理速度慢时,我看到 RES 内存变大;但在处理完所有数据后,RES 会下降,但不会回到原始 RES 值(即使等待超过 10 分钟)。

例如10 MB(原始)=> 50 MB(峰值)=> 30MB(释放所有数据后)

我使用 valgrind 和 massif 来分析内存,看起来所有数据都被释放了。我的问题是为什么 RES 不回到原来的 10 MB?

【问题讨论】:

  • 这是因为当堆上的内存完全返回给操作系统时,它是在内存分配器的处置上。但是您可以选择使用mmap()/munmap() 自己管理内存分配,以完全控制这一点。
  • C 还是 C++? IE。 newmalloc?

标签: c++ c linux memory dynamic-memory-allocation


【解决方案1】:

有很多可能的原因,我只列出两个最常见的:

  • 页面分配和碎片:操作系统以页面的形式分配内存,至少在使用MMUs 的现代系统上是如此。您的标准库的malloc()(或C++ 中new 的分配器)提供任意大小并在内部管理它们。一个页面只有在返回占用它的最后一个分配时才能返回给操作系统。如果页面中只有一个分配仍然处于活动状态,则您的进程必须保留此页面。

  • :很多库都进行自己的动态内存分配,甚至 C 标准库也这样做。


也就是说,作为Ctx commented,您可以在 Linux 上使用mmap() 自己直接分配页面,并且可以通过有效地使用这些页面来避免碎片问题。这当然意味着离开 standard C 的路径,但至少,mmap() 是在 POSIX 中指定的,因此它可以在许多系统上工作。

【讨论】:

    【解决方案2】:

    当调用free() 时,有许多操作系统不会将内存归还给操作系统的示例。

    但是,当调用 malloc()realloc() 时,它会看到已释放的内存可用。

    性能和分页是这背后的原因。在Memory usage doesn't decrease when free() used 阅读更多内容。

    这说明了您所看到的情况(即使您正在释放内存,程序外部的内存使用量也不会减少;因为它可能只会在您的程序范围内被标记为空闲)。

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 1970-01-01
      • 2018-03-09
      • 2012-09-24
      • 2019-10-25
      • 2012-11-21
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多