强制 free() 将 malloc 内存返回给操作系统

2023-12-07

似乎即使在我释放了由 分配的 Linux 进程的所有内存之后malloc(), 内存仍为进程保留,不会返回给操作系统。

Running valgrind massif默认情况下,工具不会显示任何泄漏。

Running valgrind with --pages-as-heap=yes揭示了这一点:

->13.77% (7,655,424B) 0x35FEEEB069: brk (brk.c:31)

->13.77% (7,655,424B) 0x35FEEEB113: sbrk (sbrk.c:53)

->13.77% (7,655,424B) 0x35FEE82717: __default_morecore (morecore.c:48)

->13.77% (7,655,424B) 0x35FEE7DCCB: _int_malloc (malloc.c:2455)

->13.77% (7,655,424B) 0x35FEE7F4F1: malloc (malloc.c:2862)

所以即使内存已经被释放free(), 看起来malloc called brk/sbrk并且没有将其返回给操作系统。

我怎样才能强迫free()打电话sbrk()立即并将所有内存返回给操作系统?

我正在一个非常低端的平台上运行,每个MB都很重要。

提前致谢。


使用 glibc malloc 尝试调用malloc_trim功能。它没有很好的文档记录,并且在 2007 年左右进行了内部更改(glibc 2.9) -https://stackoverflow.com/a/42281428.

自 2007 年以来,该函数将: 迭代所有 malloc 内存区域(在多线程应用程序中使用),进行修剪和 fastbin 整合;并完全释放所有对齐的 (4KB) 页。

https://sourceware.org/git/?p=glibc.git;a=commit;f=malloc/malloc.c;h=68631c8eb92ff38d9da1ae34f6aa048539b199cc

乌尔里希·德雷珀 2007 年 12 月 16 日星期日 22:53:08 +0000 (22:53 +0000)

  • malloc/malloc.c (public_mTRIm):迭代所有 arena 并为所有 arena 调用 mTRIm。

(mTRIm):另外迭代所有空闲块并使用 madvise 为所有包含至少一个的块释放内存 内存页。

https://sourceware.org/git/?p=glibc.git;a=blobdiff;f=malloc/malloc.c;h=c54c203cbf1f024e72493546221305b4fd5729b7;hp=1e716089a2b976d120c304ad75dd95c63737ad75;hb=68 631c8eb92ff38d9da1ae34f6aa048539b199cc;hpb=52386be756e113f20502f181d780aecc38cbb66a

+  malloc_consolidate (av);
...
+  for (int i = 1; i < NBINS; ++i)
...
+        for (mchunkptr p = last (bin); p != bin; p = p->bk)
+         {
...
+               /* See whether the chunk contains at least one unused page.  */
+               char *paligned_mem = (char *) (((uintptr_t) p
+                                               + sizeof (struct malloc_chunk)
+                                               + psm1) & ~psm1);
...
+               /* This is the size we could potentially free.  */
+               size -= paligned_mem - (char *) p;
+
+               if (size > psm1)
+                 {
...
+                   madvise (paligned_mem, size & ~psm1, MADV_DONTNEED);

所以,打电话malloc_trim将释放几乎所有已释放的内存回操作系统。仅保留包含尚未释放数据的页面;当使用 MADV_DONTNEED 疯狂时,操作系统可能会取消映射或不取消映射物理页,而 linux 通常会取消映射。 madvised 页面仍然计入 VSIZE(进程的总虚拟内存大小),但通常有助于减少 RSS(进程使用的物理内存量)。

或者,您可以尝试切换到替代的 malloc 库:tcmalloc (gperftools / google-perftools) 或 jemalloc (facebook),它们都具有将释放的内存返回到操作系统的积极规则(使用 madvise MADV_DONTNEED 甚至MADV_FREE).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

强制 free() 将 malloc 内存返回给操作系统 的相关文章

  • 无法在 64 位 Linux 上从汇编 (yasm) 代码调用 C 标准库函数

    我有一个函数foo以汇编语言编写 并在 Linux Ubuntu 64 位上使用 yasm 和 GCC 编译 它只是使用以下命令将消息打印到标准输出puts 如下所示 bits 64 extern puts global foo secti
  • STL之类的容器typedef快捷方式?

    STL 容器的常见模式是这样的 map
  • 将公历日期转换为儒略日期,然后再转换回来(随着时间)

    我正在编写一个程序 必须将当前的公历日期和时间转换为儒略日期 然后再转换回公历门 最终我需要添加能够添加年 月 日 小时 分钟和秒的功能 但我需要先解决这部分问题 现在我已经从公历日期转换为儒略日期 所以从逻辑上讲 我觉得我应该能够以某种方
  • 为什么子函数不销毁GtkWindow?

    这是我的代码 void window first void enter window2 GtkWidget w gpointer data void quit GtkWidget w gpointer data void quit int
  • 无法加载程序集问题

    我收到以下错误 无法加载程序集 错误详细信息 System BadImageFormatException 无法加载文件或程序集 文件 或其依赖项之一 该程序集是由比当前加载的运行时更新的运行时构建的 无法加载 该程序集是使用 Net Fr
  • 控制台应用程序中使用 Unicode 字符的 _tprintf

    我正在从 Unicode 构建的控制台应用程序 使用 C 和 Visual Studio 2008 执行这个简单的输出 此代码旨在在 Windows 上运行 tprintf L Some sample string n 一切正常 但是如果我
  • 如何将STL容器数据转储到gdb中?

    我无法在 gdb 中转储 STL 无序映射容器值 变量类型是 std unordered map var 我的 gdb 版本 7 7 1 GDB配置 configure host x86 64 linux gnu target x86 64
  • 应用程序处于中断模式。您的应用程序已进入中断状态,

    我发现自己遇到了同样的问题here https stackoverflow com questions 36204009 disable break mode page in vs2015 我在 dll 中使用 Windows 窗体 这是针
  • 处理“未找到细胞”。 Excel 中的错误

    我正在使用 Excel VSTO 应用程序并使用以下代码在工作表中查找错误单元格 Excel Range rngTemp Excel Range rngErrorRange Excel Worksheet Sheet1 Excel Work
  • 更改 Xamarin.Forms 应用中顶部栏和底部栏(ControlsBar、StatusBar)的颜色

    无论如何 即使后面需要特定于平台的代码 也可以更改顶部栏 蓝色的 和底部栏 黑色的 的颜色吗 我希望添加对浅色和深色模式的支持 因此我希望能够在运行时更改它 有可能的 Android Using Window SetStatusBarCol
  • 如何在 C# 中更改公共 IP 地址

    我正在创建一个 C winform 应用程序 我想在其中更改公共 IP 地址 而不是像 Hotspot Shield ZenMate OpenVPN 等那样更改 IPv4 地址 我已经检查了以下链接 但没有找到足够的帮助 所以我发布了这个问
  • 如何同步nosql db(ravendb)中的更改

    我已经开始在 RavenDB 的示例上学习 NoSQL 我从一个最简单的模型开始 假设我们有由用户创建的主题 public class Topic public string Id get protected set public stri
  • “1个未解决的外部”C++

    我已经检查了所有文件之间的连接以及类和函数定义 但每次我尝试运行我的程序时 它都会阻止我并告诉我它有 1 个未解析的外部 该程序应该打开多个文件 一个 学生 文件和一个 成绩 文件 从中读取数据 然后使用 查询文件 来查找数据 找到查询中要
  • 具有四个 && 的 LINQ Where 子句

    我正在尝试在Where 子句中创建一个带有4 个参数的LINQ 查询 这是一个 Windows 8 应用程序项目 我正在使用 SQLite 数据库 SQLite 实现 https github com praeclarum sqlite n
  • Boost.asio和异步链,unique_ptr?

    我对异步编程不太熟悉 我有一个问题 我的问题如下 给出 boost asio 中 C 11 的 echo server 示例 http www boost org doc libs 1 60 0 doc html boost asio ex
  • 从脚本启用/禁用 GameObject 组件 [Unity3D]

    我需要获取一个脚本中设置的布尔值 放入名为 bouclier 的变量 以启用或禁用游戏对象 该变量位于游戏对象 Player 中 此处右下角 我需要启用或禁用这个游戏对象 Bouclier01 为此 我将脚本附加到游戏对象 Bouclier
  • 在windows + opengl中选择图形设备

    我知道如何使用 openGL 打开窗口 使用 Win32 或其他工具包 但是当系统有2块显卡时 如何选择要渲染的图形设备 我的编程语言是 C 我专注于 Windows 但任何示例都将受到欢迎 编辑 也许更好地解释我的问题是个好主意 以便添加
  • 实体框架代码首次日期字段创建

    我正在使用实体框架代码优先方法来创建我的数据库表 下面的代码 创建一个DATETIME数据库中的列 但我想创建一个DATE柱子 DataType DataType Date DisplayFormatAttribute ApplyForma
  • 将一个 IEnumerable 拆分为多个 IEnumerable

    我是 linq 新手 我需要根据指示器将 Couple string text bool Indicator 类型的 IEnumerable 拆分为多个 IEnumerable 我尝试使用skipWhile 和 TakeWhile 但没有找
  • 如何使用 C# 为 azure devops 变量赋值

    我有 selenium C 测试脚本 可以从浏览器获取令牌 我有两个 azure devops 任务 一个用于执行 selenium 测试 另一个用于执行 API 测试 我想将 selenium 测试获取的令牌传递给 API 测试执行任务

随机推荐

  • 使用会话测试 Rails 控制器

    在我的应用程序中 我有一个会话控制器 现在我想测试用户控制器 只有登录后才能访问该控制器 我的问题是如何伪造会话 我已经尝试了很多 所以我希望你现在可以帮助我 应用控制器 helper method current user def aut
  • 使用AsyncTask加载位图图像

    当有人使用我的应用程序时 我试图在后台加载图像 我写的逻辑是这样的 public class ImageLoader extends AsyncTask
  • 为什么时区感知日期时间的 tzinfo 不等于时区?

    gt gt gt import pytz gt gt gt tz pytz timezone America Chicago gt gt gt dt naive datetime year 2017 month 6 day 6 gt gt
  • 如何使用 GWT EventBus

    我想知道如何使用EventBus或者是否有一些更好的解决方案来发送Event通过该项目 Widget1 has a Button Widget2 has a Label 当我按下按钮时 它应该会改变 这些小部件位于DockLayout Ro
  • 如何使用 FastAPI 允许 OpenAPI 规范(Swagger UI)中的特定参数值? [复制]

    这个问题在这里已经有答案了 我正在阅读有关的教程路径参数验证 我想允许字符串 a b 和 c 作为可能的参数值 我希望这些值显示在 OpenAPI 文档中 即FastAPI 的自动文档 这样 API 用户就不必猜测它们 如何使这些值显示在文
  • 验证库在 CMake 脚本中的 target_link_libraries 之前可用

    我有一个大型项目 由多个构建目标组成 它们之间具有依赖关系 结构类似于这样 Application lt Library I lt Library II lt Library III lt lt Library IV 存在多个这样的应用程序
  • 如何识别 CORS 预检请求?

    CORS 预检请求显然使用 OPTIONS 方法并具有 Origin 标头 然而 浏览器可以决定any添加 Origin 标头的 HTTP 请求 此外 OPTIONS 还可用于 CORS 之外的其他功能 如何 我可以识别exactly 没有
  • 无法停止运行带有 while (true) 循环的 Web 应用程序的 tomcat 服务器

    我正在开发一个要部署到 Tomcat 上的 Web 应用程序 当 Tomcat 启动时 我使用 servlet 在 web xml 中 调用 Java 类
  • 使用 oracle SQL 按分隔符位置拆分字符串

    我有一个字符串 我想在某个位置按分隔符分割该字符串 例如 我的字符串是F P O我正在寻找的结果是 因此 我想用最远的分隔符分隔字符串 注意 我的一些字符串是F O我的下面的 SQL 也可以正常工作并返回所需的结果 我写的SQL如下 SEL
  • maven在哪里安装jar包?

    因此 我将一个 Repo 从团队领导的工作空间复制到我的工作空间中 字面上使用unix CP 现在每当我跑步时mvn clean install 它将编译好的 jar 安装到他的工作空间中 我已经检查了存储库中的 pom xml 它没有明确
  • JavaScript 函数中的 this 指的是什么?

    function Box width height this width width this height height var myBox new Box 5 5 是什么new从技术上讲 关键字在这里做什么 它正在创建一个新功能吗 或者
  • django 1.7 migrate 出现错误“表已存在”

    我正在尝试应用迁移 但收到错误 django db utils OperationalError 1050 表 customers customer 已经存在 我通过发出以下命令得到这个 python manage py migrate 我
  • Spring 中的 PropertyPlaceHolder

    我们在 spring 中访问一个 java 属性 如下所示
  • CakePHP元素错误处理问题

    我的登录和注册表单位于引用用户控制器以及 login 和 register 操作的元素中 例如 当我在模式或页面控制器操作中使用此元素时 当用户出现验证错误 即模型验证 时 它会重定向到登录 注册操作页面 而不是更新元素 我意识到我可以使用
  • 滚动视图中作为列表项的内容在滚动时消失(swiftui),为什么?

    Asperi 的解决方案 ScrollView id UUID uuidString 列表项中有一个滚动视图 当我滚动列表时 滚动视图中的内容消失 我认为问题在于滚动视图和列表可重用项目冲突 如果我删除滚动视图 只是 hstack 什么都不
  • 在控制器中运行 rake 任务

    我想在我的控制器中运行 rake 任务 有什么办法可以做到这一点吗 我同意 ddfreynee 的观点 但如果你知道你需要什么 代码可能如下所示 require rake Rake Task clear necessary to avoid
  • 在 Google 表格中查找评论的位置

    我能够检索电子表格的所有评论 但是 我想知道评论所锚定的确切工作表和单元格范围 我查看了 Comments list 方法返回的评论资源的锚属性中的值 var commentsResource Drive Comments list ss
  • Gmail 中的 while(1) 有何作用[重复]

    这个问题已经存在了 可能的重复 为什么要有 while 1 在 XmlHttpRequest 响应中 如果您查看 Gmail 在更新电子邮件列表时向服务器发出的 XHR POST 请求 您将看到每个响应都以以下内容开头 while 1 v
  • PHP:当多个表单字段共享相同的名称和 ID 时使用 post

    这个标题可能没有多大意义 但我拥有的是动态生成的表单 我连接到产品表 取出其中的名称 然后 我创建一个表单 显示产品 旁边有一个复选框和文本框
  • 强制 free() 将 malloc 内存返回给操作系统

    似乎即使在我释放了由 分配的 Linux 进程的所有内存之后malloc 内存仍为进程保留 不会返回给操作系统 Running valgrind massif默认情况下 工具不会显示任何泄漏 Running valgrind with pa