美文网首页
内存管理

内存管理

作者: BigBossZhu | 来源:发表于2019-08-14 17:30 被阅读0次

1. 内存布局:记住五个字母.bss,data,text,stack,heap.对应的含义
程序加载到内存会对应成三段,1. 未初始化全局变量(bss段),2. 已初始化全局变量(data),3. 代码段(text).
栈(stack):定义的方法,函数,栈block在栈上工作的.栈是高地址向低地址扩展.向下扩展.后入先出
堆(heap):创建的对象,block进行copy之后都会被转移到堆区.向上增长的.先入先出

2.内存管理方案:iOS系统是怎样对内存进行管理的.分情况.
NSNumber等小对象:TaggedPoint.
NONPOINTER_ISA:非指针型的isa,对于64位架构下(arm64位架构)的ISA指针占64个比特位,实际上32位就够用了,剩余的比特位浪费.苹果在剩余的比特位中储存了一些内存管理的数据内容.如第0个字节用来标记是指针类型和是非指针类型的isa第一个字节用来标志当前类是否关联对象等
散列表:是一个复杂的结构,其中包括了引用计数表和弱引用表相关内容.
通过sideTables()结构实现,本质是一个哈希表.可以通过对象指针来具体找到引用计数表和弱引用表在具体哪个sideTable中,
sideTable结构:
1. 自旋锁(spinlock_t).
2. 引用计数表(RefcountMap).
3. 弱引用表(weak_table_t).

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度(不需要遍历等多余操作)。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

注意区分内存布局和内存管理的概念.
对应数据结构:
spinlock_t:是"忙等的锁",忙等指的是如果是当前锁已被其他线程获取,当前线程会不断地探测当前锁有没有被其他线程释放,如果释放马上获取.适用于轻量访问,引用计数+1,-1的操作等.
你是否使用过自旋锁?
引用计数表:本质是哈希表,通过当前对象的指针获取引用计数值(size_t).
弱引用表:本质是哈希表,通过当前对象的指针获取对应的当前对弱引用对象的储存位置.

3. MRC和ARC
MRC:手动引用计数来进行对象的内存管理.

    1. alloc分配内存空间
    2. retain,release引用计数+1,-1操作.
    3. retainCount获取当前对象的引用计数值.
    4. autorelease,调用对象的此方法当前对象会在autoreReleasePool调用release操作进行减1.
    5. delloc,mrc中需要显示调用[super delloc]来废弃父类的相关成员变量.

ARC:自动引用计数.

    1. ARC是编译器进行自动插入retain,release操作外还需要runtime协助操作.
    2. ARC禁止调用MRC中独有的方法.不能delloc中调用[super delloc]
    3. 新增weak和strong属性关键字.

引用计数管理:实现原理分析(alloc,retain,release,retainCount,dealloc)

    1. alloc实现.经过一系列封装,最终调用c函数calloc.此时并没有设置引用计数为1.
    2. retain实现,进过两次哈希查找一次差sideTable,一次查具体size_t.

        sideTable& table = sideTables()[this];
        size_t& refcntStorage = table.refcnts[this];
        refcntStorage += SiDe_TABLE_RC_ONE(此宏代表4,因为sideTables中有后两位数据储存其他意义).加1操作.
    3. release实现 
        sideTable& table = sideTables()[this];
        -=SiDe_TABLE_RC_ONE   减一操作
    4. retainCount实现
        此内局部变量为1然后+=引用计数操作.
    5. dealloc实现
        1. 调用_objc_rootDealloc()
        2. 调用rootDealloc()
        3. 判断是否可以直接释放.(很多个判断条件1. 判断当前对象是否是非指针型isa,2. 判断当前对象是否有弱指针引用指向,3. 当前对象是否有关联对象4. 是否有涉及c++相关内容以及是否使用ARC管理,5. 是否通过引用计数表维护).对象释放需要对这些操作进行相应处理.
        4. 只有都满足才会调用c的free释放.否则objec_dispose()对象清除函数.
                objec_dispose()
                1. 调用objc_destrucInstance().进行上面判断条件的一些操作进行销毁移除,此处会将指向该对象的弱引用指针置为nil.是在delloc中进行实现的
                2. 调用free释放

4. 弱引用管理:

    添加weak变量
        1. objc_initWeak()
        2. ...一系列调用堆栈
        3. weak_register_no_lock()此函数中进行弱引用变量添加,具体添加的位置通过哈希算法来进行位置查找的.如果查找对应位置中有弱引用数组将新的弱引用变量添加到数组当中,如果没有重新创建弱引用数组将当前弱引用变量作为第1个元素添加到数组中.
    清除weak变量.
        1. delloc.
        2. ...一系列调用堆栈
        3. weak_clear_no_lock(),根据当前对象指针查找弱引用表找到弱引用数组.遍历弱引用数组,分别置为nil

5. 自动释放池:

1.什么是自动释放池
自动释放池(autorelease pool)是OC的一种内存自动回收机制.
当你向一个对象发送一个autorelease消息的时候,cocoa就会将对象的一个引用放入
到最新的自动释放池中(当前线程栈顶位置),它任然是一个正当的对象,因此自动释放池
定义的作用域内的其他对象都可以向他发送消息.

2.如何工作
objective-C是通过一种”referring counting”(引用计数)的方式管理内存的
对象在开始分配内存(alloc)的时候引用计数为1,以后如果有copy,retain的时候
都会加1,每当release和autorelease的时候引用计数就会减1,如果一个对象的引
用计数为0,就会被系统销毁.
NSAutoreleasePool 就是用来做引用计数的管理工作的,这个东西一般不用你管的
autorelease和release没什么区别,只是引用计数减1的时机不同而已.autorelease
会在对象的使用真正结束的时候才做引用计数减1.

3.自动释放池的实现原理
实现原理:自动释放池以栈的形式实现:当你创建一个新的自动释放池时,它将被添加到
栈顶.当一个对象收到autorelease消息的时候,它被添加到当前线程的处于
栈顶的的自动释放池中,当自动释放池被回收时,他们就从栈中被删除,并且会
给池子里面的所有对象都会做一次release操作

相关文章

  • iOS内存管理详解

    目录 block内存管理 autorelease内存管理 weak对象内存管理 NSString内存管理 new、...

  • 第10章 内存管理和文件操作

    1 内存管理 1.1 内存管理基础 标准内存管理函数堆管理函数虚拟内存管理函数内存映射文件函数 GlobalMem...

  • 操作系统之内存管理

    内存管理 包括内存管理和虚拟内存管理 内存管理包括内存管理概念、交换与覆盖、连续分配管理方式和非连续分配管理方式(...

  • JavaScript —— 内存管理及垃圾回收

    目录 JavaScript内存管理内存为什么需要管理?内存管理概念JavaScript中的内存管理JavaScri...

  • OC - OC的内存管理机制

    导读 一、为什么要进行内存管理 二、内存管理机制 三、内存管理原则 四、MRC手动内存管理 五、ARC自动内存管理...

  • 3. 内存管理

    内存管理 内存管理包含: 物理内存管理; 虚拟内存管理; 两者的映射 除了内存管理模块, 其他都使用虚拟地址(包括...

  • Go语言——内存管理

    Go语言——内存管理 参考: 图解 TCMalloc Golang 内存管理 Go 内存管理 问题 内存碎片:避免...

  • jvm 基础第一节: jvm数据区

    程序内存管理分为手动内存管理和自动内存管理, 而java属于自动内存管理,因此jvm的职能之一就是程序内存管理 j...

  • 内存管理

    内存管理的重要性。 不进行内存管理和错误的内存管理会造成以下问题。 内存泄露 悬挂指针 OC内存模型 内存管理是通...

  • 11-AutoreleasePool实现原理上

    我们都知道iOS的内存管理分为手动内存管理(MRC)和自动内存管理(ARC),但是不管是手动内存管理还是自动内存管...

网友评论

      本文标题:内存管理

      本文链接:https://www.haomeiwen.com/subject/ggkujctx.html