再探 OSX / iOS 的内存管理
内容提要
本文介绍了iOS/OS X内存管理的概念和知识点,包括虚拟内存、页面错误、页面换出和换入、内存抖动、页面列表、清除内存和脏内存、压缩内存、内存分类、内存分配和释放、内存初始化、内存复用、大内存块申请、批量小内存申请和内存懒复制等。
关键要点
-
本文介绍了iOS/OS X内存管理的概念和知识点。
-
虚拟内存允许操作系统突破物理内存的限制,为每个进程创建独立的逻辑地址空间。
-
页面错误发生时,虚拟内存系统会产生缺页中断,加载所需数据的页面。
-
OS X中,虚拟内存系统将页面写入备份存储区,页面换出和换入的过程被描述。
-
内存抖动是由于频繁的内存交换导致的性能下降现象。
-
操作系统内核维护三个物理内存页面列表:Active List、Inactive List和Free List。
-
内存分类包括清除内存(Clean Memory)和脏内存(Dirty Memory)。
-
Compressed Memory机制在iOS7之后引入,用于处理过多的脏内存。
-
懒加载内存可以推迟内存分配,减少启动时间。
-
使用calloc函数分配内存比使用malloc和memset更高效。
-
复用临时内存可以提高性能,避免频繁申请内存。
-
申请大内存块时建议使用vm_allocate,申请小内存块时使用malloc。
-
批量小内存申请使用malloc_zone_batch_malloc函数更高效。
-
内存懒复制使用vm_copy函数,只有在需要时才进行实际的内存复制。
延伸问答
虚拟内存的概念是什么?
虚拟内存允许操作系统突破物理内存的限制,为每个进程创建独立的逻辑地址空间,并将其分成大小均匀的内存块,称为页面。
页面错误是如何发生的?
页面错误发生时,虚拟内存系统会产生缺页中断,加载所需数据的页面,并更新页表以允许程序正常访问内存地址。
内存抖动是什么?
内存抖动是由于频繁的内存交换导致的性能下降现象,表现为系统花费过多时间处理缺页中断而不是执行用户进程代码。
如何高效进行内存分配?
可以使用懒加载内存、calloc函数进行内存分配、复用临时内存和选择合适的内存分配方式来提高内存分配的效率。
清除内存和脏内存有什么区别?
清除内存是未被修改的内存页,可以被交换到磁盘;脏内存是被进程修改过的内存页,不能被交换。
如何处理过多的脏内存?
在iOS7之后,引入了Compressed Memory机制,通过压缩未被访问的脏内存页来释放内存空间。