OC的五大内存区域

作者: 邓布利多教授 | 来源:发表于2019-03-26 15:25 被阅读0次
    • 栈区(stack)
    • 堆区(heap)
    • 全局区/静态区(BSS段和数据段)
    • 常量区
    • 代码区(代码段)

    1、栈区

    栈区:又称堆栈。由系统编译器自动分配并释放内存,不需要手动管理。存储对象包括函数的参数值和局部变量等。栈对应的进程/线程是唯一的,栈与栈之间是互相独立的。栈是向低地址扩展的数据结构,是一块连续的内存区域。栈是线性结构。

    • 优缺点:由系统自动分配和管理,速度较快。由于它的后出先进(LIFO)特性,所以数据不够灵活。栈的大小是2M(或者是1M?),因此,能获得栈的空间较小。

    2、堆区

    堆区:堆是由我们主动对内存的分配和释放,在OC中的ARC模式下,由我们主动分配内存,系统编译器会自动在合适的位置为OC对象添加release操作,自动帮我们释放掉内存;而MRC模式下则需要我们自己对OC对象添加release操作。存储对象就是由alloc、init或new创建出来的对象。堆空间的分配是动态的,操作系统可以在进程初始化的时候分配,也可以在运行过程中向系统要额外的堆。不同堆分配的内存无法互相操作。堆向高地址扩展的数据结构,是不连续的内存区域。堆是链式结构。

    • 优缺点:由我们手动new分配内存,速度没有系统自动分配的速度快,容易产生内存碎片,使程序效率降低。但是由于它的数据适应面广泛,所以数据足够灵活方便。堆的大小是由设备的虚拟内存决定的,所以堆的大小比栈要大的多。
    栈和堆的区别
    • 按管理方式区分
      ,是由系统编译器自动管理,不需要程序员手动管理。
      ,ARC下释放工作有系统自动操作;MRC下释放工作由程序员手动管理,不及时回收容易产生内存泄露。

    • 按分配方式区分
      是动态分配和回收内存的,没有静态分配的堆。
      有两种分配方式:静态分配动态分配
      静态分配是系统编译器完成的,比如局部变量的分配。
      动态分配是有alloc函数进行分配的,但是栈的动态分配和堆是不同的,它的动态分配也由系统编译器进行释放,不需要手动管理。

    • 按碎片区分
      ,由于是连续的,先进后出的队列,一一对应,没有碎片。
      ,由于频繁的创建和释放必定会造成内存空间的不连续,进而造成大量的碎片,使程序效率降低。

    • 按分配效率区分
      是由系统提供的数据结构,计算机会在底层对栈提供支持,分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。
      是由C/C++函数库提供的,它的机制是很复杂的。又因为是手动new的,所以效率没有栈的分配快。

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

    • 按数据结构区分
      是一种线性的、先进后出的数据结构。
      是一棵完全的二叉树。

    3、全局区/静态区

    全局区/静态区:包括两个分区:一个是存储未初始化的(BSS段);一个是存储已初始化的(数据段) —— 全局变量和静态变量。两个分区相邻,如果在BSS段中存储的全局变量和静态变量被初始化值之后,会被转存到数据段。存储在全局区/静态区的变量只会初始化一次。

    4、常量区

    常量区:存储常量字符串。

    5、代码区

    代码区(代码段):存储程序代码、指令、函数的二进制代码。

    相关文章

      网友评论

        本文标题:OC的五大内存区域

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