iOS--虚拟内存

参考文章
要想了解什么是VM Regions,就得先了解什么是虚拟内存。当我们向系统申请内存时,系统并不会给你返回物理内存的地址,而是给你一个虚拟内存地址。每个进程都拥有相同大小的虚拟地址空间,对于32位的进程,可以拥有4GB的虚拟内存,64位进程则更多,可达16EB。只有我们开始使用申请到的虚拟内存时,系统才会将虚拟地址映射到物理地址上,从而让程序使用真实的物理内存。下面是一个简易示意图:
在这里插入图片描述
进程A和B都拥有1到4的虚拟内存。系统通过虚拟内存到物理内存的映射,让A和B都可以使用到物理内存。上图中物理内存是充足的,但是如果A占用了大部分内存,B想要使用物理内存的时候物理内存却不够该怎么办呢?在OSX上系统会将不活跃的内存块写入硬盘,一般称之为swapping out。iOS上则会通知App,让App清理内存,也就是我们熟知的Memory Warning。

堆区会被划分成很多不同的VM Region,不同类型的内存分配根据需求进入不同的VM Region。除了MALLOC_MEDIUM和MALLOC_SMALL外,还有MALLOC_TINY,MALLOC_LAEGE, MALLOC metadata等等。

VM Region Size:

我们在VM Track中可以看到,一个VM Region有4种size。

Dirty Size
Swapped Size
Resident Size
Virtual Size
Virtual Size顾名思义,就是虚拟内存大小,将一个VM Region的结束地址减去起始地址就是这个值。Resident Size指的是实际使用物理内存的大小。Swapped Size则是交换到硬盘上的大小,仅OSX可用。Dirty Size根据官方的解释我的理解是如果一个内存页想要被复用,必须将内容写到硬盘上的话,这个内存页就是Dirty的。下面是官方对Dirty Size的解释。secondary storage可以理解为硬盘。

malloc 和 calloc:

我们除了使用NSObject的alloc分配内存外,还可以使用c的函数malloc进行内存分配。malloc的内存分配当然也是先分配虚拟内存,然后使用的时候再映射到物理内存,不过malloc有一个缺陷,必须配合memset将内存区中所有的值设置为0。这样就导致了一个问题,malloc出一块内存区域时,系统并没有分配物理内存。然而,调用memset后,系统将会把malloc出的所有虚拟内存关联到物理内存上,因为你访问了所有内存区域。我们通过代码来验证一下。在main方法中,创建一个1024*1024的内存块,也就是1M。
在这里插入图片描述
在这里插入图片描述

malloc_zone_t 和 NSZone:

相信大家对NSZone并不陌生,allocWithZone或者copyWithZone这2个方法大家应该也经常见到。那么Zone究竟是什么呢?Zone可以被理解为一组内存块,在某个Zone里分配的内存块,会随着这个Zone的销毁而销毁,所以Zone可以加速大量小内存块的集体销毁。不过NSZone实际上已经被苹果抛弃。你可以创建自己的NSZone,然后使用allocWithZone将你的OC对象在这个NSZone上分配,但是你的对象还是会被分配在默认的NSZone里。例如:

    static NSMutableSet *objs = nil;
    if (objs == nil) { objs = [NSMutableSet new]; }
    
    NSZone *testZone = NSCreateZone(1024, 1024, YES);
    NSSetZoneName(testZone, @"Test Object Zone");
    for (int i = 0; i < 1000; ++i) {
        TestObject *obj = [TestObject allocWithZone:testZone];
        [objs addObject:obj];
    }

代码创建了1000个TestObject对象,但是最后其实都在系统默认床架的NSZone中,Test Object Zone中只有1个node,其中是用来存放Zone本身的信息的,如果你真的想用Zone内存机制,可以使用malloc_zone_t。通过下面的代码可以在自定义的zone上malloc内存块,例如:

    malloc_zone_t *testZone = malloc_create_zone(1024, 0);
    malloc_set_zone_name(testZone, "Test malloc zone");
    for (int i = 0; i < 1000; ++i) {
        malloc_zone_malloc(testZone, 300 * 4096);
    }

最后运行的结果是我们的Test malloc zone中有1001个node,也就是1000个Test_zone_malloc出来的内存块加上zone本身的信息所占的内存块。

另外我们可以使用malloc_destroy_zone(testZone)一次性释放上面分配的所有内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在VMware中安装iOS系统,你可以按照以下步骤进行操作: 1. 首先,在VMware Workstation Pro软件中,点击工具栏上的"文件",然后选择"新建虚拟机"或点击主页上的"创建新的虚拟机"按钮。 2. 在新建虚拟机向导中,选择"自定义(高级)"选项,并点击"下一步"。 3. 在虚拟机硬件兼容性设置中,选择与所需的iOS版本兼容的硬件兼容性,然后点击"下一步"。 4. 在虚拟机操作系统安装选项中,选择"安装操作系统后再添加",然后点击"下一步"。 5. 在虚拟机硬件配置选项中,根据需要进行配置,例如分配给虚拟机的内存和处理器数量。 6. 在虚拟硬件配置选项中,选择"使用ISO映像文件",然后点击"浏览"按钮,选择iOS系统的ISO映像文件。 7. 继续按照向导的指示完成虚拟机设置过程。 8. 创建虚拟机后,返回软件主界面,在"我的计算机"中找到你新创建的虚拟机,然后点击它。 9. 在虚拟机列表中,找到并点击"编辑虚拟机设置"选项。 10. 在虚拟机设置中,可以进行各种配置,例如网络、存储和显示等。 11. 确保你的虚拟机的名称和位置设置正确。对于位置设置,建议选择一个磁盘空间较大的路径,以免挤爆你的系统盘。 12. 完成所有的配置后,点击"确定"保存设置。 13. 现在,你可以启动虚拟机并按照iOS系统的安装流程进行操作。 请注意,安装iOS系统虚拟机需要你提供相应的iOS系统的ISO映像文件。另外,确保你的计算机满足VMware Workstation Pro的系统要求和硬件要求。 希望这些步骤对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值