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

osg*_*sgx 6 malloc glibc heap-memory

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

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

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

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

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

(也在http://www.linuxjournal.com/node/6390/print高级内存分配,2003 年 -通过调用在 free() 函数内部完成自动修剪memory_trim()

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

 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.
Run Code Online (Sandbox Code Playgroud)

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

所以,问题是:当malloc_trim或其内部实现(mtrim/mTRIm通过的glibc)被调用时,它被称为freemallocmalloc_consolidate或任何其他功能?

如果此调用在当前版本的 glibc 中丢失,是否存在于任何早期版本的 glibc、任何版本的 ptmalloc2 或原始 dlmalloc 代码中 ( http://g.oswego.edu/dl/html/malloc.html)?何时以及为何被移除?(systrim/sys_trim和之间有什么区别malloc_trim?)