glibc malloc(ptmalloc2)中有incorrectly documented个函数malloc_trim
,由Doug Lea和Wolfram Gloger于1995年添加(dlmalloc 2.5.4)。
在glibc中,这个函数可以将一些应用程序释放的内存返回给操作系统,使用负sbrk进行堆修剪,madvise(...MADV_DONTNEED)
用于堆中间未使用的页面(feature is in malloc_trim
since 2007 - glibc 2.9,但不是systrim
),可能不是通过修剪额外的线程竞技场(不是由mmaped分配的sbrk作为单独的堆)。
这样的函数对于一些长期运行的C ++守护进程非常有用,它们可以执行大量具有大量混合大小分配的线程,包括所需大小的小,小,中和大。这些守护进程可能具有几乎恒定的活动量(由malloc分配但尚未释放)内存,但同时随着时间的推移在RSS(物理内存消耗)中增长。但并不是每个守护进程都可以调用这个函数,并不是这些守护进程的每个作者都知道他应该定期调用这个函数。
Kerrisk的malloc_trim
手册页http://man7.org/linux/man-pages/man3/malloc_trim.3.html(2012)在Notes中说明了从glibc malloc的其他部分自动调用malloc_trim
:
在某些情况下,free(3)会自动调用此函数。
(同样在http://www.linuxjournal.com/node/6390/print高级内存分配中,2003 - 通过调用memory_trim()
在free()函数内完成自动修剪。
本说明可能来自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.
但是根据glibc的malloc中malloc_trim
的grep:http://code.metager.de/source/search?q=malloc_trim&path=%2Fgnu%2Fglibc%2Fmalloc%2F&project=gnu有:tst-trim1.c
的声明,定义和两次调用(测试,不是malloc的一部分)。整个glibc grep的结果相同(另外它在abilists中列出)。 malloc_trim
的实际实施是mtrim()
,但只能从malloc.c的__malloc_trim()
调用。
所以问题是:当glibc调用malloc_trim
或其内部实现(mtrim
/ mTRIm
)时,它是从free
还是{{1}调用的}或malloc
,或任何其他功能?
如果这个调用在当前版本的glibc中丢失了,是否存在于任何早期版本的glibc,任何版本的ptmalloc2或原始的dlmalloc代码(http://g.oswego.edu/dl/html/malloc.html)中?何时以及为何删除? (malloc_consolidate
/ systrim
和sys_trim
之间有什么区别?)