[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

相关文章

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

如何解决mmcv无法安装或安装之后报错问题

《如何解决mmcv无法安装或安装之后报错问题》:本文主要介绍如何解决mmcv无法安装或安装之后报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mmcv无法安装或安装之后报错问题1.当我们运行YOwww.chinasem.cnLO时遇到2.找到下图所示这里3.

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

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对数据库设备要求较高)分治法(常