关于内存

101 阅读2分钟
Page分页

分页的基本方法就是把地址空间人为地等分成固定大小的页,每一页的大小由硬件决定,或硬件支持多种大小的页,由操作系统选择决定页的大小。

页错误 Page Fault 进程需要用到页时,而所用到的Page不在内存中,硬盘就会捕获到这个消息,就是所谓的页错误 Page Fault,然后操作系统接管进行,负责将使用的page从磁盘中读出来,并装入内存,然后将内存中的这2个页与之建立映射关系。

虚拟存储的实现需要依靠硬件的支持,对于不同的CPU来说是不通过的,但是几乎所有的硬件都采用一个叫(MMU Memory Management Uni)的部件来进行页映射

在映射模式下,CPU发出的是Virtual Address,即我们的程序看到的是虚拟地址,经过MMU转换后变成Physocal Address,一般MMU都集成在CPU内部了,不会以独立的部件存在。

APP的内存类型

当内存不足时候,系统会按照一定策略来腾出更多空间使用,比较常见的做法是将一部分低优先级的数据挪到磁盘上,这个操作叫做page out,当再次访问这块数据的时候,系统会从磁盘中读取并保存到内存中,这个操作称为page in

对于频繁对磁盘进行IO操作会降低存储设备的寿命,从iOS7开始,iOS采用压缩内存的办法来释放空间,被压缩的内存称为Compressed Memory。iOS APP的内存类型有三种 ,分别是Clean MemoryDirty MemoryCompressed Memory

Clean Memory

就是可以以page out(交换到磁盘中保存)的内存,当再次访问这些数据,从磁盘中page in ,主要包含以下几类

  • APP的二进制可执行文件
  • Framework中未使用_DATA_CONST段
  • 内存文件映射的内存页
  • 未写入数据的内存页
Dirty Memory

是指APP写入过数据的内存,包括所有堆区的对象、图片解码缓冲区。

一句话总结 Dirty Memory是指被进程修改过的内存页,Clean Memory是指可以被还原的内存页。

Compressed Memory

当内存吃紧时,会回收Clean Memory,而Dirty Memory不能被回收,iOS通过内存压缩器对Dirty内存页进行压缩,举个🌰: 某个Array使用了5个page的内存,如果一算时间没有被访问同时,内存吃紧,则系统会尝试对其进行压缩,从5个page压缩为1个page,从而释放2个page的内存,但如果之后需要对其访问,需要解压成5个page的内存。

内存检测工具Instruments

image.png

首先了解下工具中各个参数的含义