我有一个进程,它不断地分配内存,并在另一个线程处理相关数据之后释放它。当数据处理速度慢时,我看到RES内存增长;但是在所有数据处理完之后,RES会下降,但不会返回到原来的RES值(即使在等待超过10分钟之后)。
例如10 MB (原始) => 50 MB (峰值) => 30 MB(在释放所有数据之后)
我已经使用valgrind和massif来分析内存,看起来所有的数据都被释放了。我的问题是为什么RES不回到原来的10 MB?
发布于 2017-11-27 10:07:19
有很多可能的原因,我只想列举两个最常见的原因:
malloc() (或C++中的new分配器)提供任意大小的内存,并在内部进行管理。只有在返回占用页面的最后一个分配时,才能将页面返回到操作系统。如果页面中的单个分配仍然处于活动状态,则您的进程必须保留此页面。尽管如此,作为Ctx评论,您可以使用在Linux上使用mmap()直接进行页面分配,并可能通过高效地使用这些页面来避免碎片问题。这当然意味着离开标准 C的路径,但至少在POSIX中指定了mmap(),因此它可以在许多系统上工作。
发布于 2017-11-27 10:08:33
在调用OSes时,有许多free()示例不将内存返回给操作系统。
但是,当调用malloc()或realloc()时,它将看到可用的空闲内存。
实现和分页是背后的原因。在当空闲()使用时,内存使用不会减少中阅读更多内容。
这就是你所看到的(程序之外的内存使用不会减少,即使你正在释放内存;因为它可能只在程序的范围内被标记为空闲)。
https://stackoverflow.com/questions/47508165
复制相似问题