内存管理机制

内存管理机制与内存映射相关。

一、C与C++

之所以将C与C++放在一起是因为C++是C的超集;

但是C是面向过程语言,C++是面向对象的语言;

C与C++都可以使用malloc、calloc、realloc来申请内存空间;

其中void* malloc(size_t size)是在内存的动态存储区中分配一块长度为size字节的连续区域,参数size为需要内存空间的长度,返回该区域的首地址;

void* calloc(size_t num,size_t size)与malloc相似,不过函数calloc() 会将所分配的内存空间中的每一位都初始化为零;

void* realloc(void* p,size_t newsize)是给一个已经分配了地址的指针重新分配空间,可以做到对动态开辟内存大小的调整;

申请内存空间失败会返回NULL,用完后通过free释放;

C++相比C多了new&delete的函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间,执行构造函数和析构函数是C++面向对象的特性;

二、Objective-C与Swift

iOS通过引用计数和自动释放池来进行内存管理,通常引用计数存储在对象的成员isa_t里的extra_rc中,在__arm64__环境下,extra_rc在内存中占19位,在__x86_64__环境下,占8位;

以__x86_64__环境为例,extra_rc大小总共8bit,最多存放2^7量级的数值,所以当extra_rc达到最大值需要通过另外的结构来存储引用计数;

App全局会维护一个SideTables,里面包含多个SideTable,可以通过对象的hash运算找到对应的SideTable,一个SideTable对应多个对象,里面有一个引用计数表和弱引用计数表;

再次对对象hash运算可以从SideTable中的refcnts中获取对象的引用计数;

weak_table中保存weak_entries,从weak_entries中通过对象查找某对象的弱引用信息weak_entry_t,weak_entry_t内保存着弱引用该对象的指针地址的hash数组;

当弱引用一个对象时,会通过obj从SideTables找到SideTable,找到SideTable中的弱引用表weak_table,通过obj从weak_table中的weak_entries找到obj对应的weak_entry_t,在obj对应的weak_entry_t的weak_referrer_t中加入弱引用obj的指针;

当对象释放时,会通过obj从SideTables找到SideTable,找到SideTable中的弱引用表weak_table,通过obj从weak_table中的weak_entries找到obj对应的weak_entry_t,查找weak_entry_t中的weak_referrer_t数组,并将weak_referrer_t中存储的指针指向nil;

每当有一个新的强引用指针指向,对象的引用计数就会+1,当减少一个强引用指针,引用计数就会-1,当引用计数为0时,对象就会被销毁;

对于自动释放池(@autoreleasepool),是一个双向链表结构,出栈入栈都是从栈顶开始;

objc_autoreleasePoolPush操作对应批量次的AutoReleasePoolPage::push(),会把pool中的对象全部压入栈结构;

objc_autoreleasePoolPop操作对应批量次的AutoReleasePoolPage::pop(),表示出栈,会依次给对象发送release消息,释放过程在pool自身对应的线程中进行;

栈有最大限额,超过后会新建一个栈节点添加到pool,新的对象会存入新栈;

当RunLoop即将进入休眠会销毁old pool同时释放pool中的对象,新建new pool;

主线程会自动创建RunLoop,子线程需要通过获取才会创建,RunLoop的作用是保活和任务处理。

不论是java还是dart都有对应的引用计数来进行内存管理机制,js的内存管理更像C++一样简陋。

相关推荐
Sam_Deep_Thinking3 分钟前
如何让订单系统和营销系统解耦
java·架构·系统架构
云泽8083 分钟前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
lzhdim23 分钟前
SQL 入门 12:SQL 视图:创建、修改与可更新视图
java·大数据·服务器·数据库·sql
AI进化营-智能译站1 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
Morwit1 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
FQNmxDG4S1 小时前
Maven依赖管理:版本冲突解决与生命周期控制
java·数据库·maven
qeen871 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码1 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
傻瓜搬砖人2 小时前
Spring集成Web环境
java·spring·maven
xmdy58662 小时前
Flutter+开源鸿蒙实战|智安盾电商溯源平台Day1 项目搭建与整体方案拆解
flutter·开源·harmonyos