iOS内存管理之Swapped Memory

Swap Space


LinuxMacos等系统有一个Swap space的概念,当物理内存紧张时,系统会将inactivepages放到Swap SpaceSwap Space为磁盘上的某个区域,一般是文件形式,这样能节省出来一部分的物理内存,不过,当我们需要访问已经放到磁盘中的内存时,由于已经不在物理内存中,会引发缺页中断,需要再次从磁盘中重新读取,所以会比直接从内存获取要慢。

不过iOS系统并没有Swap Space,原因可能有二,其一是iPhoneFlash闪存空间受限;其二是CPU受限,因为手机的CPU相比电脑还是有一定差距。

Swapped Size


iOS中,内存分为两种,一种为Clean memory,另一种为Dirty memory
Clean memorypage可以换出,既磁盘中有其对应内容,系统可以在内存紧张时将Clean memorypage换出,当再次访问时,可以重新从磁盘中读取,我们使用的图片、mapped filesFramework的数据段常量以及代码段等,这些都是Clean memory
Dirty memory是无法换出的,我们所有的堆上的分配等都是属于Dirty memory,所以我们一定要尽可能的减少Dirty memory的使用。

iOS7开始,iOS引入了Compression的概念,如下图为InstrumentsAllocations template,我们可以从标红的地方看到,有一个Swapped Size的指标,从WWDC 2018 416得知,该指标的含义为compression size,即系统可以把最近最少使用的Dirty memory进行压缩,这样可以腾出一些pages供使用,当再次需要访问内容时,系统将其解压,这时,原来内容占多少pages,解压后同样会是相同数量的pages

上图为JetsamEvent的log,展示了compression size等指标,jetsam_thread线程运行在阻塞的循环中,当唤起时,根据内存列表来kill掉处于top的进程,当内存足够时,再次进入休眠。

参考


  1. https://devstreaming-cdn.apple.com/videos/wwdc/2018/416n2fmzz0fz88f/416/416_ios_memory_deep_dive.pdf
  2. http://newosxbook.com/articles/MemoryPressure.html