iOS底层原理以内存五大区

在iOS中,内存主要分为:栈区堆区全局区(静态区)常量区以及代码区等五大区,本文主要分析这五大区。markdown

栈区分析

什么是栈

  • 栈是系统数据结构,其对应的线程或进程是惟一的
  • 栈是从高地址向低地址扩展的数据结构
  • 栈是一块连续的内存区域,遵循先进后出原则
  • 栈的地址空间是以0x7开头
  • 栈是在运行时开辟

栈的存储

  • 栈是由编译器自动建立和释放的
  • 存储局部变量,一旦离开做用于就会销毁释放
  • 存储函数参数,包括隐藏函数,好比(id self, SEL _cmd)

栈的优缺点

  • 优势:因为是编译器自动建立和释放的,因此不会产生内存碎片一块连续的内存区域,因此查找速度快
  • 缺点:因为是一块连续的内存区域,因此存储空间大小有限制
    • iOS主线程默认是1M,其余线程是512kb,实际上咱们也能够经过线程的stackSpace去修改,可是成本有些大

堆区

定义

  • 堆是从低地址向高地址扩展数据
  • 堆的内存区域是不连续的,方便增、删、改,相似链表
  • 堆遵循先进先出FIFO原则
  • 堆的地址空间是以0x6开头
  • 堆通常是在运行时分配内存

特色

  • 变量经过newallocmallocrealloc生成的内存放在堆区
  • 因为是运行时开辟,且内存区域是不连续的,致使容易出现内存碎片
  • 因为iOS目前都是ARC管理内存,因此通常无需手动释放

全局区(静态区)

全局区(静态区)是编译时分配的内存区域。在iOS中通常以0x1开头,在程序运行时一直存在,直到程序结束释放空间。数据结构

  • 已初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量存放在另外一块区域
  • static修饰的变量成为静态变量,该变量内存放在全局区(静态区),由程序编译时建立。
  • static能够修饰局部变量也能够修饰全局变量

常量区

常量区是一块比较特殊的存储区,常量区里面存放的是常量,常量字符串就存放在常量区。 常量区的内存在编译阶段完成分配,程序运行时会一直存在内存中,只有当程序结束后才会由操做系统释放。函数

代码区

存放可执行代码的二进制文件区,它在程序编译时存入,只可读不可写spa

总结

栈区、堆区内存空间是运行时分配的,所以随着程序运行而变化;在iOS中堆区的内存是应用程序共享的,堆区的内存分配是系统负责的。全局区(静态区)、常量区、代码区是在编译时分配,是固定的不可变的。操作系统

相关文章
相关标签/搜索