首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >释放内存后,进程的RES内存会下降吗?

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

Stack Overflow用户
提问于 2017-11-27 09:58:53
回答 2查看 504关注 0票数 1

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-27 10:07:19

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

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

尽管如此,作为Ctx评论,您可以使用在Linux上使用mmap()直接进行页面分配,并可能通过高效地使用这些页面来避免碎片问题。这当然意味着离开标准 C的路径,但至少在POSIX中指定了mmap(),因此它可以在许多系统上工作。

票数 1
EN

Stack Overflow用户

发布于 2017-11-27 10:08:33

在调用OSes时,有许多free()示例不将内存返回给操作系统。

但是,当调用malloc()realloc()时,它将看到可用的空闲内存。

实现和分页是背后的原因。在当空闲()使用时,内存使用不会减少中阅读更多内容。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47508165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档