内存的几大区域
1.栈区
局部变量和实参
2.堆
OC中用new,alloc 方法创建的对象
3.BSS段
没有初始化的全局变量和静态变量
4.常量区/数据段
用来存储已经初始化的全局变量、静态变量、常亮数据
5.代码段
代码的二进制文件
OC内存堆栈
- 概念
a. 栈区(stack):
由编译器自动分配释放,存放函数的参数值、局部变量等值。其操作方式类似于数据结构中的栈。
b.堆区(heap):
一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。堆为链表结构。 - 回收方式
a.栈:
系统分配自动回收,生命周期只是在函数运行过程中,运行后就释放,不可以在访问。
b.堆:
程序员根据需要自己申请的空间,不手动释放,就一直可以访问到。 - 申请后系统的响应
a.栈:
只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
b.堆:
操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆,然后将该节点的空间分配给程序。
内存泄漏话术
内存泄漏:程序结束了,堆
对象内存没有释放
僵尸对象:已经被释放,堆
空间已经释放的对象
野指针:指向僵尸对象
的指针
空指针:指向nil
的指针,给空指针发送消息(调用方法)不会报任何错误
static
所有未加static
前缀的全局变量
和函数
都具有全局可见性
,其他的源文件也能访问。如果加了static
,就会对其他源文件隐藏。
利用这一特性可以在不同的文件中定义同名函数
和同名变量
,而不必担心命名冲突。
- 对于函数来讲,
static
的作用仅限于隐藏。 - 对于变量,
static
还有以下作用:
1.控制变量的可见范围
2.保持变量内容的持久,存储在静态数据区
的变量会在程序刚开始运行
时就完成初始化,也是唯一
的一次初始化。共有两种变量存储在静态存储区:全局变量
和static变量
3.默认初始化为0
互斥锁与自旋锁
- 互斥锁
如果共享数据已经有其他线程加锁了,线程会进入休眠状态等待锁。一旦被访问的资源被解锁,则等待资源的线程会被唤醒 - 自旋锁
如果共享数据已经有其他线程加锁了,线程会以死循环的方式等待锁,一旦被访问的资源被解锁,则等待资源的线程会立即执行。
结论:自旋锁效率会比较高,但是消耗的CPU资源会更多,所以我们一般耗时的操作都会选择互斥锁,这样就不会占用过多的CPU资源。
持续更新中....
网友评论