内存管理机制

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

一、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++一样简陋。

相关推荐
风华圆舞7 分钟前
鸿蒙 + Flutter 下 AI 页面的状态协同设计
人工智能·flutter·harmonyos
影寂ldy12 分钟前
C# 事件完整学习笔记(发布订阅 + 自定义事件 + 内置 EventHandler)
笔记·学习·c#
极客BIM工作室17 分钟前
OCCT gp_Trsf 三维变换类深度剖析:经典设计与底层陷阱
c++
技术小结-李爽25 分钟前
【工具】Maven的使用
java·maven
sou_time27 分钟前
从 0 到 商用:AI Agent x SKILL x MCP 全栈实战教程:L2 高等篇:MCP 协议 + Spring AI + Agent 编排
java·人工智能·spring
醉城夜风~30 分钟前
类和对象III
开发语言·c++
冷小鱼32 分钟前
高级研发编码习惯:从规范到艺术,再到AI+时代的人机协同
java·开发语言·python·编码习惯
齐 飞36 分钟前
JDK21虚拟线程
java·后端
小马爱打代码40 分钟前
Java 并发 Bug 深度分析与实战
java
极客先躯1 小时前
高级java每日一道面试题-2026年02月09日-实战篇[Docker]-Docker 容器有哪些安全风险?如何缓解?
java·运维·网络·安全·docker·容器