内存释放后进程的RES内存会下降吗?

Will process's RES memory drop after memory freed?

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

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

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

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

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

  • :很多库都有自己的动态内存分配,甚至 C 标准库也有。


也就是说,, you can do direct page allocations yourself on Linux using mmap() 并可能通过有效地使用这些页面来避免碎片化问题。这当然意味着离开 standard C 的路径,但至少,mmap() 是在 POSIX 中指定的,因此它可以在许多系统上工作。

有许多 OSes 的例子在调用 free() 时不将内存返回给 OS。

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

性能和分页是这背后的原因。在 Memory usage doesn't decrease when free() used.

中阅读更多内容

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