iOS VM Tracker中'Dirty Memory'与'Dirty Size'的区别解析
Xcode Instruments中Dirty内存类型与Dirty Size指标的区别
Dirty内存类型
这是内存分配的分类标签,用来标记某类分配的「属性特征」。像malloc这类堆分配,从设计逻辑上就属于容易产生脏页的类型,所以被归类为Dirty类型——它描述的是分配的固有属性,和这块内存实际有没有产生脏页完全没关系。
Dirty Size指标
这是实际被修改过的物理内存页的总大小。当你用malloc分配内存时,系统只是先给你划了一块虚拟地址空间,并没有立刻分配物理内存页;只有当你真正往这块内存里写数据时,对应的虚拟页才会被映射到物理页,同时标记为「脏页」(因为内容和磁盘上的原始副本不一样了),这部分被修改过的物理页的总和就是Dirty Size。
举个实际例子:
执行int *array = malloc(2000 * sizeof(int));时,malloc返回的虚拟地址还没被写入任何数据,所以这部分分配属于Dirty内存类型,但它的Dirty Size是0。只有当你给array赋值(比如array[0] = 1;)后,对应的物理页才会被标记为脏页,Dirty Size才会跟着增加。
结合WWDC 2022提到的内存分类逻辑:Dirty内存本身指的是驻留物理内存占比高、且内容已被修改的内存;Instruments里的Dirty类型是提前给高风险分配打标签,方便追踪,而Dirty Size则是这类分配实际产生的脏页规模。
内容的提问来源于stack exchange,提问作者I_Jemin
相关产品推荐
相关产品推荐

