[glibc] free之后的内存什么时候还给操作系统?

最近遇到一个关于程序释放(free函数调用后的)的内存什么时候返回给操作系统的问题。这里以glibc为例,每一种内存管理程序的实现可能都不一样。整体思路大体都是按照不着急还回去,以备将来的不时之需!

从glibc的内部看,返回给系统的途径,要根据申请的方式来判断,比如根据实现,使用sbrk/brk申请的内存,要用sbrk/brk来返回给操作系统。如果是使用mmap申请的内存,调用的系统函数就是munmap。这些从用户角度来看是看透明的,要看具体的malloc接口文档,里面有关于选用方式的说明。我们可以根据glibc提供的一些参数,环境变量的设置来看具体使用哪一个方式。详细的说明要看这个里面的说明(而且可以使用mallopt接口更改某些参数值):
https://www.man7.org/linux/man-pages/man3/mallopt.3.html

从调用方式上看,程序可以主动返还内存的方法是:malloc_trim。另一个方法是,让glibc自动返还内存的方法,如果是sbrk的话,是根据参数设置:
FASTBIN_CONSOLIDATION_THRESHOLD:这个是宏定义改不了,值是64K;意思是说,当释放的内存(和前后可以整合的chunk之和)大小超过了这个值,就会走入整合的逻辑,在整合之后根据heap里的top空闲内存的大小(和M_TRIM_THRESHOLD作比较)来判断释放要做trim。

M_TRIM_THRESHOLD,这个是默认128K(所以上面那个值是64K,是这个值的一半)。如果空虚内存大于这个值,就做trim。

如果是mmap申请的内存,不受这两个参数限制,如果是free不用了,总是会被返回给操作系统。

所以需要根据自己的具体情况来看,要看返还所带来的效益高低:比如系统的总内存不够用,就需要程序主动返还;如果系统内存够用,返还回去,程序后续还得再次申请,就不如不返还。

最后,目前看是没有办法来看,到底free了多少,同时又没有返还给操作系统。需要自己单独写工具来看。比较麻烦。但也不是不可能!另一个问题,那这一部分释放的内存,会在系统需要的时候由系统回收呢?其实没有这样的逻辑。如果系统内存不够用,可能会导致新的程序例的内存申请返回errno=12,申请不到内存。即使之前的程序已经调用了free函数,但是仍然没有返回给系统。

https://www.gnu.org/software/libc/manual/html_node/Freeing-after-Malloc.html

Occasionally,free can actually return memory to the operating system and make the process smaller. Usually, all it can do is allow a later call to malloc to reuse the space. In the meantime, the space remains in your program as part of a free-list used internally by malloc.这个文档里也说是有可能。

举例:假如一个程序,申请的都是小内存,连续申请2G。后续即使使用free函数释放了这2G的内存,但是依然会保留在程序的“常驻内存区”。

如果free之后,调用了malloc_trim:就可以释放这2G的内存。或者后续有大于32K(要看具体的设置)大小内存整体free的操作,也是有机会调用到trim的操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/212891.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

案例064:基于微信小程序的考研论坛设计

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

问题:batchnormal训练单个batch_size就会报错吗

Batch Normalization(批标准化)是一种深度学习中的正则化技巧,它可以改进网络的训练过程。在训练神经网络时,Batch Normalization可以帮助解决内部协变量偏移(Internal Covariate Shift)的问题。 在标准的…

软件测试--selenium安装使用

安装selenium不少人使用pip命令来安装selenium,辛辛苦苦安装完之后,还是不能使用。所以我们可以是直接使用编译器,pycharm直接安装selenium扩展包。 file中点击settings 在Settings中点击Project Interpreter,点击加号就可以安装各种需要的扩…

Docker安装postgres最新版

1. postgres数据库 PostgreSQL是一种开源的关系型数据库管理系统(RDBMS),它是一种高度可扩展的、可靠的、功能丰富的数据库系统。以下是关于PostgreSQL的一些介绍: 开源性:PostgreSQL是一个开源项目,可以…

One-to-Few Label Assignment for End-to-End Dense Detection阅读笔记

One-to-Few Label Assignment for End-to-End Dense Detection阅读笔记 Abstract 一对一(o2o)标签分配对基于变换器的端到端检测起着关键作用,最近已经被引入到全卷积检测器中,用于端到端密集检测。然而,o2o可能因为…

docker镜像仓库hub.docker.com无法访问

docker镜像仓库hub.docker.com无法访问 文章主要内容: 介绍dockerhub为什么无法访问解决办法 1 介绍dockerhub为什么无法访问 最近许多群友都询问为什么无法访问Docker镜像仓库,于是我也尝试去访问,结果果然无法访问。 大家的第一反应就是…

flutter开发实战-ValueListenableBuilder实现局部刷新功能

flutter开发实战-ValueListenableBuilder实现局部刷新功能 在创建的新工程中,点击按钮更新counter后,通过setState可以出发本类的build方法进行更新。当我们只需要更新一小部分控件的时候,通过setState就不太合适了,这就需要进行…

MQTT协议对比TCP网络性能测试模拟弱网测试

MQTT正常外网压测数据---时延diff/ms如下图: MQTT弱网外网压测数据 TCP正常外网压测数据 TCP弱网外网压测数据 结论:

这些接口自动化测试工具如果不知道,就真out了!

一、Postman Postman是一款广受欢迎的API测试工具,除了手动发送HTTP请求的基本功能,它还提供了自动化测试和脚本测试的功能,非常适合进行HTTP接口的自动化测试。 二、Rest-Assured Rest-Assured是一个Java库,专为REST服务的测试…

craco + webpack 4 升 5

craco webpack 4 升 5 更新包版本尝试build升级其他依赖库使用process插件打印进度信息到底需要多少内存分析构建产出添加 splitChunk总结记录一些好文章: 我的项目使用 craco react 开发 我的 package.json {// ......"dependencies": {"ant-desi…

WebSocket入门介绍及编程实战

HTTP的限制 全双工和半双工: 全双工:全双工(Full Duplex)是允许数据在两个方向上同时传输。 半双工:半双工(Half Duplex)是允许数据在两个方向上传输,但是同一个时间段内只允许一个…

为什么每个 Java 开发者都需要了解 Scala

前面我们一起回顾了第九期 Scala & Java Meetup 中最受关注的话题 —— jdk 并发编程的终极解决方案:虚拟线程,探讨了这一新特性对包括 Scala 在内的响应式编程语言的影响。 本次 Meetup 的首位分享者 Chunsen,在加入 Tubi 成为 Scala 开…

微服务实战系列之J2Cache

前言 经过近几天陆续发布Cache系列博文,博主已对业界主流的缓存工具进行了基本介绍,当然也提到了一些基本技巧。相信各位盆友看见这么多Cache工具后,在选型上一定存在某些偏爱: A同学说:不管业务千变万化,…

Linux环境下ARM开发

目录 前言ARM启动及开发基础1.Cortex-A架构2.启动方式3.汇编基础4.Makefile语法基础5.Makefile补充6.编译下载 结语 前言 主要介绍基于linux开发环境下,如何开发ARM A7 ARM启动及开发基础 1.Cortex-A架构 1)Cortex-A7运行模式 模式说明User(USR)用户模…

想转行IT,有前途吗?

作为一个在工程领域工作了三年的人,我深知转行到 IT,尤其是网络安全领域,不是一件轻松的事。我的经历或许能为你提供一些启示。 在我之前的工作中,虽然工作量大、压力重,但总觉得缺少了某种成就感和动力。我意识到&a…

SQL Server——权限管理

一。SQL Server的安全机制 SQL Server 的安全性是建立在认证和访问许可两种安全机制之上的。其中.认证用来确定登录Sal Server 的用户的登录账户和密码是否正确.以此来验证其是否具有连接SQL Server 的权限;访问许可用来授予用户或组能够在数据库中执行哪…

Python ItsDangerous库:构建安全可靠的数据传输

更多资料获取 📚 个人网站:ipengtao.com ItsDangerous是Python中一个轻量级的库,旨在提供安全且简单的数据传输和签名功能。本文将深入介绍ItsDangerous的核心特性、基本用法以及在实际应用中的一些示例,通过丰富的示例代码&…

海云安谢朝海:开发安全领域大模型新实践 人工智能助力高效安全左移

2023年11月29日,2023中国(深圳)金融科技大会成功举行,该会议是深圳连续举办的第七届金融科技主题年度会议,也是2023深圳国际金融科技节重要活动之一。做好金融工作,需要兼顾创新与安全,当智能体…

Node.js入门指南(完结)

目录 接口 介绍 RESTful json-server 接口测试工具 会话控制 介绍 cookie session token 上一篇文章我们介绍了MongoDB,这一篇文章是Node.js入门指南的最后一篇啦!主要介绍接口以及会话控制。 接口 介绍 接口是前后端通信的桥梁 &#xff0…

微信小程序基础

1.小程序发展史 微信小程序之前,是使用weixin-sdk进行开发,调用视频,摄像头等。 微信小程序weixin up端,所以PC端的window这些没有,运行环境是IOS,安卓等,有一些特殊的调用录音功能&#xff0…