3 回答
TA贡献1891条经验 获得超3个赞
以下分析仅适用于glibc(基于ptmalloc2算法)。某些选项似乎有助于将释放的内存返回给系统:
mallopt()(定义
malloc.h
)确实提供了一个使用参数选项之一设置修剪阈值的选项M_TRIM_THRESHOLD
,这表示数据段顶部允许的最小可用内存量(以字节为单位)。如果数量低于此阈值,glibc将调用brk()
以将内存返回给内核。M_TRIM_THRESHOLD
Linux中的默认值设置为128K,设置较小的值可能会节省空间。通过在环境变量中设置修剪阈值可以实现相同的行为
MALLOC_TRIM_THRESHOLD_
,绝对没有源更改。但是,使用的初步测试程序
M_TRIM_THRESHOLD
已经表明,即使malloc分配的内存确实返回系统,最初请求的实际内存块(竞技场)的剩余部分brk()
也会被保留。可以通过调用
malloc_trim(pad)
(定义malloc.h
)来修剪内存区域并将任何未使用的内存返回给系统。此函数调整数据段的大小,pad
在其末尾至少留下字节,如果可以释放少于一页的字节,则失败。段大小始终是一页的倍数,在i386上为4,096字节。可以使用malloc钩子功能来完成这种修改的
free()
使用行为的malloc_trim
实现。这不需要对核心glibc库进行任何源代码更改。madvise()
在glibc的免费实现中使用系统调用。
TA贡献1805条经验 获得超9个赞
我正在处理与OP相同的问题。到目前为止,似乎有可能使用tcmalloc。我找到了两个解决方案
编译你的程序与tcmalloc链接,然后启动它:
env TCMALLOC_RELEASE=100 ./my_pthread_soft
文件中提到了这一点
合理的费率在[0,10]范围内。
但是10对我来说似乎不够(也就是说我看不到变化)。
在代码中找到释放所有释放内存的有趣内容,然后添加以下代码:
#include "google/malloc_extension_c.h" // C include#include "google/malloc_extension.h" // C++ include/* ... */MallocExtension_ReleaseFreeMemory();
在我的情况下,第二种解决方案非常有效; 第一个会很棒,但不是很成功,例如找到正确的数字很复杂。
添加回答
举报