我有一个持续分配内存的进程,并在另一个线程处理完相关数据后将其释放。当数据处理速度很慢时,我看到RES存储器长大了;但是在处理完所有数据后,RES会降低但不会恢复到原来的RES值(即使等待超过10分钟)。
e.g。 10 MB(原始)=> 50 MB(峰值)=> 30MB(释放所有数据后)
我已经使用valgrind with massif来分析内存,看起来所有数据都被释放了。我的问题是为什么RES不会回到原来的10 MB?
答案 0 :(得分:1)
有很多可能的原因,我只会列出两个最常见的原因:
页面分配和碎片:操作系统根据页面分配内存,至少在使用MMU的现代系统上。您的标准库malloc()
(或C ++中new
的分配器)提供任意大小并在内部管理它们。页面只能在返回占用它的最后一个分配时返回给操作系统。如果页面中只有一个分配仍处于活动状态,则您的流程必须保留此页面。
库:很多库都会自己动态分配内存,即使是C标准库也是如此。
也就是说,Ctx commented,可以在Linux上使用mmap()
自行直接进行页面分配,并且可以通过有效地使用这些页面来避免碎片问题。这当然意味着离开标准 C的路径,但至少在POSIX中指定了mmap()
,因此它可以在许多系统上运行。