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)

    • 包括两个部分:未初始化 、已初始化;
    • 全局区/静态区,在内存中是放在一起的,已初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域;

    常量区
    常量字符串就是放在这里。

    代码区
    存放 App 代码。

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

  4. 注意事项

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

    • iOS 是基于 UNIX、Android 是基于 Linux 的,在 Linux 和 unix 系统中,内存管理的方式基本相同;
    • Android 应用程序的内存分配也是如此。除此以外,这些应用层的程序使用的都是虚拟内存,它们都是建立在操作系统之上的,只有开发底层驱动或板级支持包时才会接触到物理内存,

    在嵌入式 Linux 中,实际的物理地址只有 64M 甚至更小,但是虚拟内存却可以高达 4G;

iOS 内存分配与分区的更多相关文章

  1. iOS — 内存分配与分区

    1  RAM ROM RAM:运行内存,不能掉电存储.ROM:存储性内存,可以掉电存储,例如内存卡.Flash.      由于RAM类型不具备掉电存储能力(即一掉电数据消失),所以app程序一般存放 ...

  2. iOS 中内存分配与分区

    关于RAM ROM RAM与ROM就是具体的存储空间,统称为存储器 RAM(random access memory):运行内存,CPU可以直接访问,读写速度非常快,但是不能掉电存储.它又分为: 动态 ...

  3. C++内存分配和分区

    1.分配方式 静态分配: 静态区(全局区),分配全局变量.静态变量优先于main函数. 动态分配: (1)自动分配:栈区(2)手动分配:堆区,(malloc,free) (new,delete) 2. ...

  4. 程序如何在RAM ROM运行,内存分配与分区

    关于RAM ROM RAM与ROM就是具体的存储空间,统称为存储器 RAM(random access memory):运行内存,CPU可以直接访问,读写速度非常快,但是不能掉电存储.它又分为: 动态 ...

  5. iOS程序中的内存分配 栈区堆区全局区

    在计算机系统中,运行的应用程序的数据都是保存在内存中的,不同类型的数据,保存的内存区域不同.一.内存分区 栈区(stack) 由编译器自动分配并释放,存放函数的参数值,局部变量等.栈是系统数据结构,对 ...

  6. iOS开发——C篇&动态内存分配

    再C语言中关于内存是一个很重要的知识点,所以今天我就从c语言的内存分配开始为大家解析一下C语言再iOS开发中非常重要的一些知识. 1:malloc函数的介绍 C语言中开辟内存空间:malloc函数 再 ...

  7. iOS 内存管理

    一 . 内存管理 包括内存分配 和 内存清除 1.内存管理的范围 :人和继承于NSObject类的对象都需要进行内存管理,任何非对象类型的对象(基本数据类型 如 int char float doub ...

  8. 第8章 文件系统管理(2)_挂载、fdisk分区及分配swap分区

    3. fdisk分区 3.1 fdisk命令分区过程 (1)添加新硬盘 (2)查看新硬盘#fdisk –l (3)使用fdisk命令分区:#fdisk /dev/sdb Fdisk交互指令说明 命令 ...

  9. java内存分配和String类型的深度解析

    [尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...

随机推荐

  1. .Net Core调用oracle存储过程

    一 前言 实战踩坑系列,调用第三方Oracle存储,各种血泪史,现记录如下. 二 入坑 首先,调用Oracle需要安装客户端驱动才行,但是在程序开发中下载客户端驱动是一个不明智的选择.于是,不管是微软 ...

  2. 基于python openOPC的监控页面一

    笔者涉猎的工业领域项目遇到一个需求,需要把底层设备(表记)的状态和运行数据集中放到一个监控画面进行展示,数据需要在界面端实时进行刷新,类似网友的例子,如下图(侵删) 数据需要实时主动刷新,笔者基于多年 ...

  3. nginx能访问html静态文件但无法访问php文件

    nginx.conf中红框部分修改成你的实际网站根目录

  4. webpack里的externals

    最近在用webpack做一些是sdk相关的东西,有几个概念总结一下: 1.library要做sdk,一定要做的一个配置,用于说明最终的SDK暴露给调用者的一个名称例如:library: 'HelloJ ...

  5. 前端性能优化之 Composite

    摘要: 一个 Web 页面的展示,简单来说可以认为经历了 JavaScript/Style/Layout/Paint/Composite 几个步骤.本文主要深入 Composite 部分,从渲染原理. ...

  6. 伪元素 before 和 after 初探

    伪元素 before 和 after 初探 使用了 CodePen 做演示,欢迎点击预览 定义 首先来看 MDN 的定义: ::before 创建一个伪元素,作为已选中元素的第一个子元素,常通过 co ...

  7. Java避坑宝典《Java业务开发常见错误100例》上线了

    写这个专栏的缘起 之前我写过一篇博客:<朱晔的互联网架构实践心得S2E2:写业务代码最容易掉的10种坑>,引起的关注还是挺多的.后来和极客时间的编辑一拍即合决定以这个为题写一个专栏.其实所 ...

  8. 报错: raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

    Django2.0同步Mysql数据库时出现的问题 执行 python manage.py makemigrations 报错 # 报错位置 File "G:\python\lib\site ...

  9. java后台生成并下载二维码

    这个功能在项目开发中是很基础的,平时用到的也很多,这里简单记录一下,以便以后使用的时候参考 前提业务要求:前台页面展示数据,有下载按钮,点击下载,下载对应数据的二维码. 首先,在pom.xml文件中添 ...

  10. 实现Sobel算子滤波、Robers算子滤波、Laplace算子滤波

    前几天,老师布置了这样一个任务,读取图片并显示,反色后进行显示:进行Sobel算子滤波,然后反色,进行显示:进行Robers算子滤波,然后反色,进行显示.我最后加上了Laplace算子滤波,进行了比较 ...