https://xiaozhuanlan.com/topic/6973420158
[https://developer.apple.com/documentation/xcode/improving_your_app_s_performance/reducing_your_app_s_memory_use]
内存
虚拟内存
虚拟内存技术可以使一个应用程序认为自己有一段连续的内存空间(多个大小相同的内存页page组成的逻辑地址空间),使得程序编程和运行起来容易;同事隐藏了真实的物理内存地址,起到一定的保护作用;还能隔离不同的进程,更安全
当前虚拟内存和物理内存的分页都是16kb
iOS虚拟内存
内存空间结构
因为iPhone中的磁盘用的是闪存(容量和读写寿命都有限制),所以iOS中没有memory swap机制,memery swap也就是当内存空间不足时将部分内存数据存储到磁盘中,等到下次使用时再从磁盘中,等到下次使用时,再从磁盘读取数据到内存中。
取而代之的是,iOS采用的是内存警告memory warning,当系统检测到内存空间不足时,会给每个进程APP发送memory warning。
Clean momery 和Dirty memory
Memory Page 分为 Clean Memory 和 Dirty Memory,前者通常来说是指能够进行memory swap的memory page,而后者不能够进行内存置换操作,但是iOS因为没有memory swap,所以Clean Memory不是通常的意思,在iOS中是指能够重复被使用的内存页,相对的,Dirty Memory 是不能够重复使用的内存页
Clean Memory 主要包括以下几部分:
- app的二进制可执行文件
- framework中的_DATA_CONST 段
- 文件映射的内存
- 未写入数据的内存
下面就“未写入数据的内存”举个例子:
int *array = malloc(20000 * sizeof(int));
array[0] = 32
array[19999] = 64
那内存页分类如下:
红色的页是 Dirty Memory,蓝色的页是Clean Memory
MRC就是手动加retain release autorelease,ARC就是编辑器帮你加retain release autorelease,下面测试下MRC: