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

2023-12-08 21:52

本文主要是介绍[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的操作。

这篇关于[glibc] free之后的内存什么时候还给操作系统?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/471442

相关文章

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

龙蜥操作系统Anolis OS-23.x安装配置图解教程(保姆级)

《龙蜥操作系统AnolisOS-23.x安装配置图解教程(保姆级)》:本文主要介绍了安装和配置AnolisOS23.2系统,包括分区、软件选择、设置root密码、网络配置、主机名设置和禁用SELinux的步骤,详细内容请阅读本文,希望能对你有所帮助... ‌AnolisOS‌是由阿里云推出的开源操作系统,旨

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11