gpt4 book ai didi

memory-management - 调用 free 或 delete 是否会将内存释放回 "system"

转载 作者:行者123 更新时间:2023-11-30 16:53:30 24 4
gpt4 key购买 nike

这是我的问题:调用 free 或 delete 是否会将内存释放回“系统”。我所说的系统是指,它是否减少了进程的数据段?

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

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

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

glibc的文档告诉我,如果分配请求远大于页面大小,它将使用mmap进行分配,并在释放后直接释放回系统。凉爽的。但假设我从不要求分配大于 50 字节的大小,并且我在系统峰值负载时要求很多这样的 50 字节对象。然后呢?

据我所知(请纠正我),在进程结束之前,用 malloc 分配的内存永远不会被释放回系统,即如果我释放它,分配器只会将其保留在空闲列表中。但困扰我的问题是,如果我使用一个工具来查看进程的内存使用情况(我在 Linux 上使用 pmap,你们用什么?),它应该始终显示峰值负载时使用的内存(因为内存永远不会返回给系统,除非使用 mmap 分配)?也就是说进程使用的内存永远不应该减少(堆栈内存除外)?是吗?

我知道我遗漏了一些东西,所以请阐明这一切。

请专家澄清我对此的概念。我会很感激。我希望我能够解释我的问题。

最佳答案

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

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

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

关于memory-management - 调用 free 或 delete 是否会将内存释放回 "system",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40836221/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com