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的进程,当内存足够时,再次进入休眠。