为了账号安全,请及时绑定邮箱和手机立即绑定

malloc实现是否会将free-ed内存返回给系统?

malloc实现是否会将free-ed内存返回给系统?

HUWWW 2019-08-08 15:39:56
malloc实现是否会将free-ed内存返回给系统?我有一个长期存在的应用程序,频繁的内存分配 - 释放。任何malloc实现都会将释放的内存返回给系统吗?在这方面,什么是以下行为:ptmalloc 1,2(默认为glibc)或3dlmalloctcmalloc(谷歌线程malloc)solaris 10-11默认malloc和mtmallocFreeBSD 8默认malloc(jemalloc)Hoard malloc?更新如果我有一个应用程序,其白天和夜晚的内存消耗可能非常不同(例如),我可以强制任何malloc将系统释放的内存吗?如果没有这样的返回,释放的内存将被多次换出,但这样的内存只包含垃圾。
查看完整描述

3 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

以下分析仅适用于glibc(基于ptmalloc2算法)。某些选项似乎有助于将释放的内存返回给系统:

  1. mallopt()(定义malloc.h)确实提供了一个使用参数选项之一设置修剪阈值的选项M_TRIM_THRESHOLD,这表示数据段顶部允许的最小可用内存量(以字节为单位)。如果数量低于此阈值,glibc将调用brk()以将内存返回给内核。

    M_TRIM_THRESHOLDLinux中的默认值设置为128K,设置较小的值可能会节省空间。

    通过在环境变量中设置修剪阈值可以实现相同的行为MALLOC_TRIM_THRESHOLD_,绝对没有源更改。

    但是,使用的初步测试程序M_TRIM_THRESHOLD已经表明,即使malloc分配的内存确实返回系统,最初请求的实际内存块(竞技场)的剩余部分brk()也会被保留。

  2. 可以通过调用malloc_trim(pad)(定义malloc.h)来修剪内存区域并将任何未使用的内存返回给系统。此函数调整数据段的大小,pad在其末尾至少留下字节,如果可以释放少于一页的字节,则失败。段大小始终是一页的倍数,在i386上为4,096字节。

    可以使用malloc钩子功能来完成这种修改的free()使用行为的malloc_trim实现。这不需要对核心glibc库进行任何源代码更改。

  3. madvise()在glibc的免费实现中使用系统调用。



查看完整回答
反对 回复 2019-08-08
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

我正在处理与OP相同的问题。到目前为止,似乎有可能使用tcmalloc。我找到了两个解决方案

  1. 编译你的程序与tcmalloc链接,然后启动它:

    env TCMALLOC_RELEASE=100 ./my_pthread_soft

    文件中提到了这一点

    合理的费率在[0,10]范围内。

    但是10对我来说似乎不够(也就是说我看不到变化)。

  2. 在代码中找到释放所有释放内存的有趣内容,然后添加以下代码:

    #include "google/malloc_extension_c.h" // C include#include "google/malloc_extension.h"   // C++ include/* ... */MallocExtension_ReleaseFreeMemory();

在我的情况下,第二种解决方案非常有效; 第一个会很棒,但不是很成功,例如找到正确的数字很复杂。


查看完整回答
反对 回复 2019-08-08
  • 3 回答
  • 0 关注
  • 691 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信