ios内存五大分区

iOS中,内存主要分为栈区、堆区、全局区、常量区、代码区五大区域

  1. 栈区

定义

栈是系统数据结构,其对应的进程或者线程是唯一的

栈是向低地址扩展的数据结构

栈是一块连续的内存区域,遵循先进后出(FILO)原则

栈的地址空间在iOS中是以0X7开头

栈区一般在运行时分配

存储

栈区是由编译器自动分配并释放的,主要用来存储

局部变量

函数的参数,例如函数的隐藏参数(id self,SEL _cmd)

优缺点

优点:因为栈是由编译器自动分配并释放的,不会产生内存碎片,所以快速高效

缺点:栈的内存大小有限制,数据不灵活

iOS主线程栈大小是1MB

其他主线程是512KB

MAC只有8M

传入函数的参数值、函数体内声明的局部变量等,由编译器自动分配释放,通常在函数执行结束后就释放了。(注意:不包括static修饰的变量,static意味该变量存放在全局/静态区)其操作方式类似数据结构中的栈,先进后出。

栈内存分配运算内置于处理器的指令集,效率很高,但是分配的内存容量有限,比如iOS中栈区的大小是2M(看网上说,也有人说1M,我也不知道具体大小,但栈区的内存肯定不会太大)。

存放的局部变量、先进后出、一旦出了作用域就会被销毁;函数跳转地址,现场保护等;

程序猿不需要管理栈区变量的内存

栈区地址从高到低分配;

2.堆区

定义

堆是向高地址扩展的数据结构

堆是不连续的内存区域,类似于链表结构(便于增删,不便于查询),遵循先进先出(FIFO)原则

堆的地址空间在iOS中是以0x6开头,其空间的分配总是动态的

堆区的分配一般是在运行时分配

存储

堆区是由程序员动态分配和释放的,如果程序员不释放,程序结束后,可能由操作系统回收,主要用于存放

OC中使用alloc或者 使用new开辟空间创建对象

C语言中使用malloc、calloc、realloc分配的空间,需要free释放

优缺点

优点:灵活方便,数据适应面广泛

缺点:需手动管理,速度慢、容易产生内存碎片

当需要访问堆中内存时,一般需要先通过对象读取到栈区的指针地址,然后通过指针地址访问堆区

堆区的内存是由代码分配和释放,用于存放进程运行中被动态分配的内存段,堆区的大小并不固定,可动态扩张或缩减。

变量通过new、alloc、malloc、realloc分配的内存块就存放在堆区。

堆区的内存都是动态分配的。

当进程调用alloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张)。

当利用realse释放内存时,被释放的内存从堆中被剔除(堆被缩减)。

如果应用程序没有释放掉,操作系统会自动回收,分配方式类似于链表。

因为现在iOS基本都使用ARC来管理对象,所以也不需要手动释放。

一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

  1. 全局/静态区域 即.bss

全局区是编译时分配的内存空间,在iOS中一般以0x1开头,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放,主要存放

未初始化的全局变量

未初始化的静态变量

由static修饰的变量会成为静态变量,该变量的内存由全局/静态区在编译阶段完成分配,且仅分配一次。

static可以修饰局部变量也可以修饰全局变量。

  1. 常量区

常量区是编译时分配的内存空间,在iOS中一般以0x1开头,在程序结束后由系统释放,主要存放

已初始化的全局变量

已初始化的静态变量(即Static)

  1. 代码区

代码区是编译时分配主要用于存放程序运行时的代码,代码会被编译成二进制存进内存的

代码区需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入(修改)操作——它是不可写的。

通常代码段是可共享的,这使得需要频繁被执行的程序只需要在内存中拥有一份拷贝即可。代码段也通常是只读的,这样可以防止其他程序意外地修改其指令。另外,代码段还规划了局部数据所申请的内存空间信息。 代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

感谢作者内容转自 链接:https://www.jianshu.com/p/7f9483f9c92a

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • iOS中,内存主要分为栈区、堆区、全局区、常量区、代码区五大区域 1. 栈区 定义 栈是系统数据结构,其对应的进程...
    北京_小海阅读 2,613评论 0 6
  • 一、栈区 又称 堆栈 ,由编译器自动分配释放,是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}” 中定...
    奉灬孝阅读 543评论 0 2
  • 1.bss段( bss segment ) bss段通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区...
    dozening007阅读 5,275评论 2 5
  • 关于iOS内存的五大分区 1.bss段( bss segment ) bss段通常是指用来存放程序中未初始化的全局...
    7_c5dc阅读 601评论 0 1
  • 内存五大分区: ■ 代码段:存放函数体的二进制代码 ■文字常量区:常量字符串就是放在这里的, 程序结束后由系统释放...
    南山码僧阅读 604评论 0 1