美文网首页开发者iOS BlogiOS知识收集
深入浅出-iOS内存分配与分区

深入浅出-iOS内存分配与分区

作者: 机器学习架构 | 来源:发表于2016-02-15 01:49 被阅读5973次


1. RAM ROM

RAM:运行内存,不能掉电存储。ROM:存储性内存,可以掉电存储,例如内存卡、Flash。
由于RAM类型不具备掉电存储能力(即一掉电数据消失),所以app程序一般存放于ROM中。RAM的访问速度要远高于ROM,价格也要高。

2. App程序启动

App程序启动,系统会把开启的那个App程序从Flash或ROM里面拷贝到内存(RAM),然后从内存里面执行代码。
另一个原因是CPU不能直接从内存卡里面读取指令(需要Flash驱动等等)。

3. 内存分区:

  • 栈区(stack):
- 存放的局部变量、先进后出、一旦出了作用域就会被销毁;函数跳转地址,现场保护等;
- 程序猿不需要管理栈区变量的内存;
-栈区地址从高到低分配;     
  • 堆区(heap):
    • 堆区的内存分配使用的是alloc;
    • 需要程序猿管理内存;
    • ARC的内存的管理,是编译器再便宜的时候自动添加 retain、release、autorelease;
    • 堆区的地址是从低到高分配)
  • 全局区/静态区(static):
    • 包括两个部分:未初始化过 、初始化过;
      也就是说,(全局区/静态区)在内存中是放在一起的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域;
      eg:int a;未初始化的。int a = 10;已初始化的。
  • 常量区:常量字符串就是放在这里;
  • 代码区: 存放App代码;

如下图所示:代码区存放于低地址,栈区存放于高地址。区与区之间并不是连续的。

****注意事项****

  • 在iOS中,堆区的内存是应用程序共享的,堆中的内存分配是系统负责的;
  • 系统使用一个链表来维护所有已经分配的内存空间(系统仅仅纪录,并不管理具体的内容);
  • 变量使用结束后,需要释放内存,OC中是根据引用计数==0,就说明没有任何变量使用该空间,那么系统将直接收回;
  • 当一个app启动后,代码区,常量区,全局区大小已固定,因此指向这些区的指针不会产生崩溃性的错误。而堆区和栈区是时时刻刻变化的(堆的创建销毁,栈的弹入弹出),所以当使用一个指针指向这两个区里面的内存时,一定要注意内存是否已经被释放,否则会产生程序崩溃(也即是野指针报错)。

其它操作系统

  • iOS是基于UNIX、Android是基于Linux的,在Linux和unix系统中,内存管理的方式基本相同;

  • Android应用程序的内存分配也是如此。除此以外,这些应用层的程序使用的都是虚拟内存,它们都是建立在操作系统之上的,只有开发底层驱动或板级支持包时才会接触到物理内存;
    举例:在嵌入式Linux中,实际的物理地址只有64M甚至更小,但是虚拟内存却可以高达4G;


相关文章

  • 深入浅出-iOS内存分配与分区

    Posted by 微博@iOS音视频 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creativ...

  • iOS内存分配与分区

    1.RAM ROM RAM:运行内存,不能掉电存储. ROM:存储型内存,可以掉电存储,例如内存卡,Flash.由...

  • iOS开发-内存分配与分区

    iOS开发中的内存分配与分区 内存 关于RAM&ROM RAM与ROM就是具体的存储空间,统称为存储器。 RAM(...

  • iOS 内存分区和分配

    1 RAM ROM RAM:运行内存,不能掉电存储。ROM:存储性内存,可以掉电存储,例如内存卡、Flash。 由...

  • 探索iOS内存分配

    探索iOS内存分配 探索iOS内存分配

  • iOS知识梳理12:堆和栈

    相关连接iOS程序中的内存分配 栈区堆区全局区 内存分区 1.栈区(stack) 由编译器自动分配并释放,存放函数...

  • 第四章内存空间管理(2)

    单一连续分配 固定分区分配 如何划分分区大小 程序分配内存的过程 动态分区分配 分区分配算法首次适应算法FF 循环...

  • iOS中的block块存储位置

    有了上面一篇《iOS开发中的内存分配与分区》的说明,现在可以对iOS中block的存储位置做一下说明了。 这里说明...

  • iOS-归纳

    iOS内存分区,堆区 栈区等 内存管理 属性关键字、内存分区总结 iOS- 数据存储iOS开发数据库-FMDBiO...

  • iOS开发中的内存分配与分区

    打开简书发现自己竟然这么久没有更新文章了,实在罪过。下面继续... 关于RAM&ROM RAM与ROM就是具体的存...

网友评论

  • 八匹马_BPM:这种水平可以写些底层的C语言代码了,比如芯片中嵌入语音解码,编码传感器代码了!你很有水平啊,作者真牛!
  • Sin丶:ROM 不是Read Only Memory的意思嘛? 只读存储 内存卡/Flash Memory是可读写的! 完全属于同级概念词
  • 木子尚武:楼主在注意事项中有讲,系统使用一个链表来维护所有已经分配的内存空间,这个内存空间包括了栈分配的内存空间吗?还有堆中也有一个链表,记录内存节点.那堆中的链表和楼主所说的链表有什么不同吗?
  • 7b15af9a092f:已经保存地址
  • white_W:什么是掉电存储呢?
    white_W:@奋斗的DevAmos :懂了~
    奋斗的DevAmos:掉电存储:以让你在停电后的一段时间里,把完整的数据信息保存好
  • 零纪年:mark, 感谢分享 !
  • chermon:感谢分享
  • GorCat:Mark - 内存管理
  • 幻凌风:简洁易懂,赞!
  • ryugaku:马克
  • Seaboy灬:还好,基本上都看过,不过作者更细一点。:relieved:
    机器学习架构:@糖灬度 :+1:
  • ninja4ever:博主能否给一些内存相关的参考文章,多谢,
    ninja4ever:@Yangcs ty so much.
    机器学习架构:@callen
    http://blog.csdn.net/youoran/article/details/10990815
    http://www.cnblogs.com/autum/archive/2012/10/12/linuxmalloc.html
  • 一个人的阳光:没什么用
    7b15af9a092f:你觉得没用说明你很low
    一个人的阳光:谢谢分享
    机器学习架构:@一个人的阳光 各有各的理解吧,我觉得挺重要的 :relaxed:
  • 43c977dcbafe:清晰明了,:+1:
    机器学习架构:@O_o最美的烟火 谢谢支持

本文标题:深入浅出-iOS内存分配与分区

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