再探 OSX / iOS 的内存管理

💡 原文中文,约9600字,阅读约需23分钟。
📝

内容提要

本文介绍了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机制,通过压缩未被访问的脏内存页来释放内存空间。

🏷️

标签

➡️

继续阅读