内存管理机制

内存管理机制与内存映射相关。在这里插入图片描述

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

相关推荐

  1. 【QT入门】 Qt内存管理机制详解

    2024-01-03 17:28:02       14 阅读
  2. Python的内存管理与垃圾回收机制

    2024-01-03 17:28:02       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-03 17:28:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-03 17:28:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-03 17:28:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-03 17:28:02       18 阅读

热门阅读

  1. 后端开发——jdbc的学习(一)

    2024-01-03 17:28:02       39 阅读
  2. 今日学习的是mysql-事物

    2024-01-03 17:28:02       43 阅读
  3. 算法练习Day27 (Leetcode/Python-贪心算法)

    2024-01-03 17:28:02       32 阅读
  4. Linux内核--进程管理(十二)共享内存和信号量

    2024-01-03 17:28:02       31 阅读
  5. MongoDB CRUD 概述

    2024-01-03 17:28:02       35 阅读
  6. axios post YII2无法接收post参数问题解决

    2024-01-03 17:28:02       24 阅读
  7. pytorch 两个tensor的交集

    2024-01-03 17:28:02       37 阅读
  8. 通过 nvm 管理 Node 版本

    2024-01-03 17:28:02       44 阅读
  9. Unity 打包前,通过代码对 AndroidManifest 增删改查

    2024-01-03 17:28:02       37 阅读