iOS内存管理之Swapped Memory
Swap Space
Linux
、Macos
等系统有一个Swap space
的概念,当物理内存紧张时,系统会将inactive
的pages
放到Swap Space
,Swap Space
为磁盘上的某个区域,一般是文件形式,这样能节省出来一部分的物理内存,不过,当我们需要访问已经放到磁盘中的内存时,由于已经不在物理内存中,会引发缺页中断,需要再次从磁盘中重新读取,所以会比直接从内存获取要慢。
不过iOS
系统并没有Swap Space
,原因可能有二,其一是iPhone
的Flash
闪存空间受限;其二是CPU
受限,因为手机的CPU
相比电脑还是有一定差距。
Swapped Size
iOS
中,内存分为两种,一种为Clean memory
,另一种为Dirty memory
;Clean memory
的page
可以换出,既磁盘中有其对应内容,系统可以在内存紧张时将Clean memory
的page
换出,当再次访问时,可以重新从磁盘中读取,我们使用的图片、mapped files
、Framework
的数据段常量以及代码段等,这些都是Clean memory
。Dirty memory
是无法换出的,我们所有的堆上的分配等都是属于Dirty memory
,所以我们一定要尽可能的减少Dirty memory
的使用。
从iOS7
开始,iOS
引入了Compression
的概念,如下图为Instruments
的Allocations template
,我们可以从标红的地方看到,有一个Swapped Size
的指标,从WWDC 2018 416得知,该指标的含义为compression size
,即系统可以把最近最少使用的Dirty memory
进行压缩,这样可以腾出一些pages
供使用,当再次需要访问内容时,系统将其解压,这时,原来内容占多少pages
,解压后同样会是相同数量的pages
。
上图为JetsamEvent
的log,展示了compression size
等指标,jetsam_thread
线程运行在阻塞的循环中,当唤起时,根据内存列表来kill
掉处于top
的进程,当内存足够时,再次进入休眠。