虚拟内存简介

什么是VM Regions呢?要知道这个首先要了解什么是虚拟内存。当我们向系统申请内存时,系统并不会给你返回物理内存的地址,而是给你一个虚拟内存地址。每个进程都拥有相同大小的虚拟地址空间,对于32位的进程,可以拥有4GB的虚拟内存,64位进程则更多,可达18EB。只有我们开始使用申请到的虚拟内存时,系统才会将虚拟地址映射到物理地址上,从而让程序使用真实的物理内存。

iOS开发交流技术群:563513413,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

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代码;

内存分页

系统会对虚拟内存和物理内存进行分页,虚拟内存到物理内存的映射都是以页为最小粒度的。在OSX和早期的iOS系统中,物理和虚拟内存都按照4KB的大小进行分页。iOS近期的系统中,基于A7和A8处理器的系统,物理内存按照4KB分页,虚拟内存按照16KB分页。基于A9处理器的系统,物理和虚拟内存都是以16KB进行分页。系统将内存页分为三种状态。

活跃内存页(active pages)- 这种内存页已经被映射到物理内存中,而且近期被访问过,处于活跃状态。

非活跃内存页(inactive pages)- 这种内存页已经被映射到物理内存中,但是近期没有被访问过。

可用的内存页(free pages)- 没有关联到虚拟内存页的物理内存页集合。

当可用的内存页降低到一定的阀值时,系统就会采取低内存应对措施,在OSX中,系统会将非活跃内存页交换到硬盘上,而在iOS中,则会触发Memory Warning,如果你的App没有处理低内存警告并且还在后台占用太多内存,则有可能被杀掉。


蓝天
32 声望5 粉丝