我有一个进程不断分配内存,并在另一个线程处理完相关数据后释放它。当数据处理速度慢时,我看到 RES 内存增长;但在处理完所有数据后,RES 下降但不会恢复到原始 RES 值(即使等待超过 10 分钟)。
例如10 MB(原始)=> 50 MB(峰值)=> 30MB(释放所有数据后)
我使用带有 massif 的 valgrind 来分析内存,看起来所有数据都已释放。我的问题是为什么 RES 不回到原来的 10 MB?
最佳答案
可能的原因有很多,我只列出两个最常见的:
按页分配和分段:操作系统根据页分配内存,至少在使用 MMU 的现代系统上是这样。秒。您的标准库的
malloc()
(或 C++ 中的new
的分配器)提供任意大小并在内部管理它们。只有在返回占用它的最后一个分配时,页面才能返回给操作系统。如果页面中只有一个分配仍然处于事件状态,则您的进程必须保留此页面。库:很多库都有自己的动态内存分配,即使是 C 标准库也是如此。
也就是说,如 Ctx commented ,您可以在 Linux 上使用 mmap()
自己进行直接页面分配并可能通过有效地使用这些页面来避免碎片化问题。这当然意味着离开标准 C 的路径,但至少,mmap()
是在 POSIX 中指定的,因此它可以在许多系统上工作。
关于c++ - 内存释放后进程的RES内存会下降吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47508165/