当glocc的ptmalloc或dlmalloc中的malloc_trim被自动调用时?

时间:2017-02-16 19:44:27

标签: malloc heap-memory glibc

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 / systrimsys_trim之间有什么区别?)

0 个答案:

没有答案