内存管理

作者: 二斤寂寞 | 来源:发表于2019-05-29 20:19 被阅读11次

目录:
1内存布局
2内存管理方案
2.1Tagged Pointer
2.2NONPOINTER_ISA
2.3散列表(side table )
3数据结构
3.1自旋锁
3.2引用计数表
3.3弱引用表
4引用计数
5ARC & MRC
5.1MRC手动
5.2ARC自动
5.3iOS内存的代码实现
5.31alloc
5.32retain
5.33release
5.34retainCount
5.35autorelease
5.36dealloc
6弱引用
7自动释放池
8常见的容易造成泄漏的点
8.1循环引用
8.2使用单例的的一些情况
8.3NSTimer
8.4NSURLSession
8.5非OC对象的内存问题
8.6其他泄漏情况
8.7ARC内存泄露的检测
8.71使用Xcode自带工具Instrument
8.72在对象dealloc中进行打印


01.png

01内存布局

02.png
03.png

堆栈空间分配

栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

堆栈缓存方式

栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。 堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

内存中的栈区处于相对较高的地址以地址的增长方向为上的话,栈地址是向下增长的
栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间。另外还有静态区是分配静态变量,全局变量空间的;只读区是分配常量和程序代码空间的;以及其他一些分区。


2内存管理方案

03.png
2.1Tagged Pointer
Tagged Pointer01.png
Tagged Pointer02.png
Tagged Pointer03.png
2.2NONPOINTER_ISA(非指针型isa)
NONPOINTER_ISA01.png
NONPOINTER_ISA02.png
2.3散列表(side table )
散列表01.png
散列表02.png 散列表03.png 散列表04.png 散列表05.png 散列表06.png

3数据结构

3.1自旋锁
自旋锁.png
3.2引用计数表
引用计数表.png
3.3弱引用表
弱引用表.png

4 引用计数


5ARC & MRC

5.1 MRC(MannulReference Counting)

需要程序员自己管理一个对象的引用计数。


MRC.png
5.2 ARC(Automatic Reference Counting)

ARC 是苹果引入的一种自动内存管理机制,会根据引用计数自动监视对象的生存周期,实现方式是在编译时期自动在已有代码中插入合适的内存管理代码以及在 Runtime 做一些优化。

ARC.png
5.3 iOS内存的代码实现

5.31alloc
5.32retain
5.33release
5.34retainCount
5.35autorelease
5.36dealloc


6 弱引用

7 autoreleasepool 自动释放池


8常见的容易造成泄漏的点

8.1循环引用
8.2使用单例的的一些情况
8.3NSTimer
8.4NSURLSession
8.5非OC对象的内存问题
8.6其他泄漏情况
8.7ARC内存泄露的检测
8.71使用Xcode自带工具Instrument
8.72在对象dealloc中进行打印

参考文章:
http://blog.devtang.com/2016/07/30/ios-memory-management/
https://juejin.im/post/5abe543bf265da23784064dd
https://www.jianshu.com/p/5d2163640e26
https://juejin.im/post/5c4821fdf265da613b70159d
https://juejin.im/post/5c0744f6e51d45598b76f481
https://juejin.im/post/58c9fff8128fe1006c7be387
https://juejin.im/post/5ce36300f265da1b8b2b32b6?utm_source=gold_browser_extension#heading-14

相关文章

  • 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/ujpjtctx.html