iOS备战之内存管理(一)

iOS备战之内存管理(一)

内存布局

下面的图表示一个内存区域,内存区域从低到高分配依次为:预留区域、代码段、已初始化数据区、未初始化数据区、堆区、栈区、内核区。

内存布局.png

程序加载到内存之后,分为三个区域,代码段、已初始化区、未初始化区。


  • 预留区域:用于给系统提供一些必要的空间
  • 代码段:编译之后的代码
  • 数据区:数据段分为已初始化数据区和未初始化数据区。
    1、已初始化区:已初始化的全局变量、静态变量等。
    2、未初始化区:未初始化的全局变量、静态变量等,程序开始执行之前,内核将此段初始化为0。
  • 堆区:
    1、通过alloc、malloc、calloc等动态分配内存就是在堆上,内存地址由低到高分配。
    2、堆区是链式结构,内存不连续,是最灵活的内存区域,动态分配内存、释放内存。
    3、oc中创建的对象都是存在这里,堆中的对象都是以指针来访问的。指针从线程栈中来,但是不独属于某一个线程。
    4、堆也是对复杂的运行时处理的基础支持。无论ARC还是MRC,“谁分配谁释放”说的就是堆上对象的管理。
    5、每个程序有一个唯一的堆,这个堆由这个程序的所有线程共同访问,所以对于堆的操作需要考虑同步和互斥的问题。
  • 栈区:
    1、执行函数调用,内存地址由高向低分配,内存向下增长。栈顶的地址和栈的最大容量是系统预先规定好的。
    2、线性结构,内存连续,系统自己管理内存。存放函数的参数值、局部变量值等。alloc在堆上申请一个内存空间,返回一个指针,指针在栈上,内存空间在堆上。
    3、一个线程对应一个栈,也就是说栈对应的线程是唯一的。
    4、优点是快速高效,缺点是有限制,数据不灵活。

你可能感兴趣的:(iOS备战之内存管理(一))