地址https://www.jishudog.com/8744/html
内存布局
iOS程序下内存布局
不同内存布局区域的含义
stack(栈):方法调用
heap(堆):通过alloc等分配的对象
bss:未初始化的全局变量
data:已初始化的全局变量
text:程序代码
内存管理方案
- taggedPointer
- NONPointer_ISA
- 散列表(很复杂的数据结构,引用计数表、弱引用表)
散列表
- SideTables()(非嵌入式系统中包含64个SideTable),实际是一个哈希表,通过对象的指针找到对应的引用计数表或弱引用表,在哪一个SideTable中
- SideTable结构
包含自旋锁 引用计数表 弱引用表 - 为什么不是一个SideTable?
存在效率问题,如果多个对象在对同一张表进行引用计数时,就会等待前一个对象操作结束才能操作。引用分离锁的方案,可以提高效率 - 如果实现快速分流?(哈希查找的过程)
根据对象的地址,通过一个均匀散列函数的计算就可以得到数组下标索引值
散列表中数据结构
- 自旋锁(Spinlock_t)
是一种忙等的锁(当前锁已被其他线程获取,就会不断的探测这个锁是否被释放)
适用于轻量访问 - 引用计数表(RefcountMap)
ptr ——> DisguisedPtr(obj) ——>size_t
提高查找效率,插入和获取都是通过同一个哈希算法,避免了数组遍历 - 弱引用表(weal_table_t)
ptr ——> Hash函数——>value