内存释放后,进程的RES内存是否会下降?

时间:2017-11-27 09:58:53

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

我有一个持续分配内存的进程,并在另一个线程处理完相关数据后将其释放。当数据处理速度很慢时,我看到RES存储器长大了;但是在处理完所有数据后,RES会降低但不会恢复到原来的RES值(即使等待超过10分钟)。

e.g。 10 MB(原始)=> 50 MB(峰值)=> 30MB(释放所有数据后)

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

1 个答案:

答案 0 :(得分:1)

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

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

  • :很多库都会自己动态分配内存,即使是C标准库也是如此。

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