- 栈区(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、代码区
代码区(代码段):存储程序代码、指令、函数的二进制代码。
网友评论