当malloc_trim在 glibc 的 ptmalloc 或 dlmalloc 中从 free 自动调用时?

When malloc_trim is (was) called automatically from free in glibc's ptmalloc or dlmalloc?

提问人:osgx 提问时间:2/17/2017 最后编辑:Communityosgx 更新时间:2/17/2017 访问量:2546

问:

在 glibc malloc (ptmalloc2) 中,有错误记录的函数,由 Doug Lea 和 Wolfram Gloger 于 1995 年添加 (dlmalloc 2.5.4)。malloc_trim

在 glibc 中,此函数可以使用负 sbrk 将应用程序释放的一些内存返回给操作系统进行堆修剪,用于堆中间未使用的页面(此功能自 2007 年以来一直处于malloc_trim状态 - glibc 2.9,但不在 ),并且可能无法通过修剪额外的线程领域(这些领域不是由 mmaped 作为单独的堆分配的)。madvise(...MADV_DONTNEED)systrim

这样的函数对于一些长时间运行的 C++ 守护进程非常有用,它们执行大量具有非常多混合大小分配的线程,包括所需的小、小、中和大。这些守护进程可能具有几乎恒定的实时内存量(由 malloc 分配且尚未释放),但同时会随着时间的推移在 RSS(物理内存消耗)中增长。但并不是每个守护进程都可以调用这个函数,也不是每个守护进程的作者都知道他应该定期调用这个函数。

Kerrisk http://man7.org/linux/man-pages/man3/malloc_trim.3.html (2012) 的手册页在关于从 glibc malloc 的其他部分自动调用的注释中说:malloc_trimmalloc_trim

在某些情况下,free(3) 会自动调用此函数。

(同样在 http://www.linuxjournal.com/node/6390/print Advanced Memory Allocation, 2003 中 - 通过调用 memory_trim() 在 free) 函数中完成自动修整)

这个注释可能来自 malloc/malloc.c 的源代码,它在几个地方提到了自动调用的,可能来自 :malloc_trimfree()

 736  M_TRIM_THRESHOLD is the maximum amount of unused top-most memory
 737  to keep before releasing **via malloc_trim in free().**

 809  * When malloc_trim is called automatically from free(),
 810    it is used as the `pad' argument.

2722   systrim ... is also called by the public malloc_trim routine.

但是根据 glibc 的 malloc 中的 grep for: http://code.metager.de/source/search?q=malloc_trim&path=%2Fgnu%2Fglibc%2Fmalloc%2F&project=gnu 有:声明、定义和它的两个调用(测试,不是 malloc 的一部分)。整个 glibc grep 的结果相同(此外,它还列在 abilists 中)。的实际实现是,但它仅从 malloc.c 调用。malloc_trimtst-trim1.cmalloc_trimmtrim()__malloc_trim()

那么问题来了:当 glibc 调用 or 其内部实现 (/) 时,它是从 or or 或 调用的,还是任何其他函数?malloc_trimmtrimmTRImfreemallocmalloc_consolidate

如果此调用在当前版本的 glibc 中丢失,它是否存在于任何早期版本的 glibc、任何版本的 ptmalloc2 或原始 dlmalloc 代码 (http://g.oswego.edu/dl/html/malloc.html) 中?何时以及为何删除它?(/ 和 ?) 和有什么不一样?systrimsys_trimmalloc_trim

malloc 堆内存 glibc

评论

0赞 osgx 2/17/2017
dlmalloc 版本:g.oswego.edu/pub/misc;glibc git github.com/bminor/glibc/blob/master/malloc/malloc.c;glibc 中的 malloc 版本,带有:github.com/bminor/glibc/blob/...。RSS 内存增长示例:bugs.python.org/issue11849 - 消息133929main_trim
0赞 Massimo 3/20/2018
一个非常好的问题。我发现这种方法可以在正在运行的应用程序上测试 malloc_trim():notes.secretsauce.net/notes/2016/04/......
0赞 ZachB 12/16/2020
它就像它只在释放大空间时自动运行一样:github.com/bminor/glibc/blob/......不幸的是,“大”的阈值不是可调的。

答: 暂无答案