提问人:osgx 提问时间:2/17/2017 最后编辑:Communityosgx 更新时间:2/17/2017 访问量:2546
当malloc_trim在 glibc 的 ptmalloc 或 dlmalloc 中从 free 自动调用时?
When malloc_trim is (was) called automatically from free in glibc's ptmalloc or dlmalloc?
问:
在 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_trim
malloc_trim
在某些情况下,free(3) 会自动调用此函数。
(同样在 http://www.linuxjournal.com/node/6390/print Advanced Memory Allocation, 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 中的 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_trim
tst-trim1.c
malloc_trim
mtrim()
__malloc_trim()
那么问题来了:当 glibc 调用 or 其内部实现 (/) 时,它是从 or or 或 调用的,还是任何其他函数?malloc_trim
mtrim
mTRIm
free
malloc
malloc_consolidate
如果此调用在当前版本的 glibc 中丢失,它是否存在于任何早期版本的 glibc、任何版本的 ptmalloc2 或原始 dlmalloc 代码 (http://g.oswego.edu/dl/html/malloc.html) 中?何时以及为何删除它?(/ 和 ?) 和有什么不一样?systrim
sys_trim
malloc_trim
答: 暂无答案
评论
main_trim