是否释放或删除释放内存回到“系统”

这是我的问题:是否释放或删除释放内存回“系统”。 按照系统我的意思是,它是否减少了过程的数据部分?

让我们考虑Linux上的内存分配器,即ptmalloc。

从我所知道的(请纠正我,如果我错了),ptmalloc维护一个空闲的内存块列表,当内存分配请求到来时,它会尝试从这个空闲列表中分配一个内存块(我知道,分配器很多比这更复杂,但我只是简单地说)如果它失败,它会使用say sbrk或brk系统调用从系统获取内存。 当内存被释放时,该块被放置在空闲列表中。

现在考虑这种情况,在高峰负载时,堆上已经分配了很多对象。 现在,当负载减少时,对象就被释放。 所以我的问题是:一旦对象被释放,分配器会进行一些计算,以确定它是否应该将该对象保留在空闲列表中,或者取决于空闲列表的当前大小,它可能决定将该内存返回给系统即使用sbrk或brk减少进程的数据段。

glibc的文档告诉我,如果分配请求比页面大得多,它将使用mmap进行分配,一旦释放,将直接释放回系统。 凉。 但可以说,我从来没有要求分配大于50字节的大小,并且我在系统的峰值负载上询问了很多这样的50字节对象。 那又怎么样?

从我所知道的(请纠正我),分配给malloc的内存永远不会被释放回系统,直到进程结束,即分配器将简单地保留在空闲列表中,如果我释放它。 但是让我感到困扰的问题是,如果我使用工具来查看进程的内存使用情况(我在Linux上使用pmap,那么您使用的是什么?),它应该始终显示在高峰负载时使用的内存(因为内存永远不会回馈给系统,除非使用mmap进行分配)? 那个进程使用的内存永远不会减少(堆栈内存除外)? 是吗 ?

我知道我错过了一些东西,所以请澄清一切。

请专家们澄清我对此的看法。 我会很感激。 我希望我能解释我的问题。


malloc没有太多的开销,所以你不可能实现任何运行时节省。 然而,有一个很好的理由在malloc之上实现一个分配器,这是为了能够跟踪内存泄漏。 例如,您可以释放程序在退出时分配的所有内存,然后检查您的内存分配器是否调用余额(即分配/释放相同数量的调用)。

对于你的具体实现,没有理由free(),因为malloc不会释放到系统内存,所以它只会释放内存回你自己的分配器。

使用自定义分配器的另一个原因是您可能正在分配大量相同大小的对象(即,您有一些数据结构正在分配很多)。 您可能希望为这种类型的对象维护一个单独的空闲列表,并仅从此特殊列表中释放/分配。 这样做的好处是可以避免内存碎片。


它完全依赖于实现。 在Windows上,如果相应的内存页面只包含空闲块,VC ++程序可以将内存返回给系统。


我认为你有你需要的所有信息来回答你自己的问题。 pmap显示进程当前正在使用的内存。 因此,如果在进程达到峰值内存之前调用pmap,则不会显示峰值内存。 如果您在进程退出之前调用pmap,那么它将为不使用mmap的进程显示峰值内存。 如果进程使用mmap,那么如果在使用最大内存的地方调用pmap,它将显示峰值内存使用情况,但这一点可能不在进程结束时(可能发生在任何地方)。

这仅适用于您当前的系统(即基于您为免费提供的文档以及mmap和malloc),但正如前面的海报所述,这些行为的依赖性依赖于它。

链接地址: http://www.djcxy.com/p/80393.html

上一篇: Does calling free or delete ever release memory back to the "system"

下一篇: Big array gives segmentation error in C