关于作者

E-moss,程序员,爱好阅读和撸狗,主要从事iOS开发工作,公众号:知本集。
主要分享和编写技术方面文章,不定期分享读书笔记,亦可访问“知本集”Git地址:https://github.com/knowtheroot/KnowTheRoot_iOS,欢迎提出问题和讨论。
复制代码

Git地址:github.com/knowtheroot…

一、什么是虚拟内存

1.申请内存

当我们向系统申请内存时,系统并不会直接返回物理内存的地址,而是返回一个虚拟内存地址。从系统角度来说,每一个进程都有相同大小的虚拟内存空间。
只有当进程开始使用申请到的虚拟内存时,系统才会将虚拟地址映射到物理地址上,从而让程序使用真实的物理内存。

2.内存不够怎么办?

当A进程占用了大部分内存,此时B进程需要内存时发现内存不足,系统则会通知App,让App清理内存,既我们熟知的Memory Warning。

3.虚拟内存的缺点

虚拟内存也有同样的缺点:硬盘的容量比内存大,但也只是相对的,速度却非常缓慢,如果和硬盘之间的数据交换过于频繁,处理速度就会下降,表面上看起来就像卡住了一样,这种现象称为抖动(Thrushing)。相信很多人都有过计算机停止响应的经历,而造成死机的主要原因之一就是抖动。

二、内存分页

iOS系统会对虚拟内存和物理内存进行分页,虚拟内存到物理内存的映射都是以页为最小粒度的

1.什么是分页

1.1 分页的核心

将虚拟内存空间和物理内存空间皆划分为大小相同的页面,如4kb、8kb或16kb等。并以页面作为内存空间的最小单位,一个程序的一个页面可以存放在任意一个物理页面里。

1.2 分页解决了什么问题

  • 解决空间浪费碎片化问题:由于将虚拟内存空间和物理内存空间按照某种规定的大小进行分配,这里我们称之为页(Page),然后按照页进行内存分配,也就克服了外部碎片的问题。
  • 解决程序大小受限问题:将当前需要的页面放在内存里,其他暂时不用的页面放在磁盘上,这样一个程序同时占用内存和磁盘,其增长空间就大大增加了。

1.3 内存分页的状态

系统将内存页分为三个状态:
(1)活跃的内存页(active page):内存页已经被映射到物理内存中,而且近期被访问过,处于活跃状态。
(2)非活跃的内存页(inactive page):内存页已经被映射到物理内存中,但是近期没有被访问过。
(3)可用的内存页(free page):没有关联到虚拟内存页的物理内存页集合。

当可用的内存页降低到一定的阀值时,系统就会采取低内存应对措施,在OSX中,系统会将非活跃内存页交换到硬盘上,而在iOS中,则会触发Memory Warning,如果你的App没有处理低内存警告并且还在后台占用太多内存,则有可能被杀掉。

1.4 页表

页表的功能是提供虚拟页面到物理页面的映射
页表的记录条数与虚拟页面数相同。此外,内存管理单元依赖于页表来进行一切与页面有关的管理活动,这些活动包括判断某一页面号是否在内存里,页面是否受到保护,页面是否非法空间等等。
由于页表的特殊地位,决定了它是由硬件直接提供支持,即页表是一个硬件数据结构

三、VMObject

为了更好的管理内存页,系统将一组连续的内存页关联到一个VMObject上。
VMObject主要包含以下属性:

  • Resident pages - 已经被映射到物理内存的虚拟内存页列表
  • Size - 所有内存页所占区域的大小
  • Pager - 用来处理内存页在硬盘和物理内存中交换问题
  • Attributes - 这块内存区域的属性,比如读写的权限控制
  • Shadow - 用作(copy-on-write)写时拷贝的优化
  • Copy - 用作(copy-on-write)写时拷贝的优化

四、虚拟内存和堆(heap)

堆区会被划分成很多不同的VM Region,不同类型的内存分配根据需求进入不同的VM Region。

五、malloc和calloc

OC中,除了使用NSObject的alloc分配内存外,还可以使用c的函数malloc进行内存分配。malloc的内存分配当然也是先分配虚拟内存,然后使用的时候再映射到物理内存,不过malloc有一个缺陷,必须配合memset将内存区中所有的值设置为0。这样就导致了一个问题,malloc出一块内存区域时,系统并没有分配物理内存。然而,调用memset后,系统将会把malloc出的所有虚拟内存关联到物理内存上,因为你访问了所有内存区域。

为了解决这个问题,苹果官方推荐使用calloc代替malloc,calloc返回的内存区域会自动清零,而且只有使用时才会关联到物理内存并清零。

主要区别

calloc和malloc 主要的区别在于前者在返回内存的指针之前将它初始化为0,另外它们请求数量的方式不同。calloc的参数包括所需元素的数量和每个元素的字节,根据这些值可以计算出总共需要分配的内存空间(num_elements*element_size)个字节。

转载于:https://juejin.im/post/5cfdcaf45188253788677fa9

iOS底层系统:虚拟内存相关推荐

  1. iOS底层原理总结 - OC对象的本质

    苹果官方文档 The Objective-C language defers as many decisions as it can from compile time and link time t ...

  2. iOS底层原理探究 第一探. 事件传递和响应者链

    一. 声明:  本文意在探讨, 也参考了几位大神的文章, 在最后我会把链接发出来, 如果有理解错误的地方, 请大神们指正哈! 二. 前言:  最近自己做项目的时候, 用到了UITabbarContro ...

  3. iOS 底层探索篇 —— KVC 底层原理

    iOS 底层探索篇 -- KVC 底层原理 1. Method Swizzling的坑与应用 1.1 method-swizzling 是什么? 1.2 坑点 坑点1:method-swizzling ...

  4. iOS底层原理之内存管理

    文章目录 定时器 CADisplayLink.NSTimer GCD定时器 内存管理 iOS程序的内存布局 Tagged Pointer OC对象的内存管理 拷贝 引用计数的存储 dealloc 自动 ...

  5. 【iOS底层】11:消息转发

    一.msgSend消息发送监听 在探索了很多次了lookUpImpOrForward方法中,查找完成后会写入cache 在写入cache中发现有个打印log的操作 我们来看下是否可以通过这个输出到本地 ...

  6. iOS 底层探索 - 消息转发

    一.动态方法解析流程分析 我们在上一章<消息查找>分析到了动态方法解析,为了更好的掌握具体的流程,我们接下来直接进行源码追踪. 我们先来到 _class_resolveMethod 方法, ...

  7. iOS底层开发消息发送与转发流程

    iOS底层开发消息转发流程 一,cache缓存读取流程分析 首先我们上一章已经了解到对应的cache_t的数据结构 _bucketsAndMaybeMask:指针类型,存放buckets的首地址 _m ...

  8. 视频教程-iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-iOS

    iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化 小码哥教育CEO,曾开发了2个iOS的流行开源框架(MJRefresh.MJExtension),目前在国内的使用率非常高. 李 ...

  9. iOS底层探索二(OC 中 alloc 方法 初探)

    前言 相关文章: iOS底层探索一(底层探索方法) iOS底层探索三(内存对齐与calloc分析) iOS底层探索四(isa初探-联合体,位域,内存优化) iOS底层探索五(isa与类的关系) iOS ...

最新文章

  1. Altium Designer PCB快速布局
  2. 启动springboot报错Error creating bean with name 'dataSource' defined in class path resource
  3. 从一年关店千家到营利双增,都市丽人做对了什么?
  4. sklearn 中的preprocessing数据预处理
  5. php mysql无限_php+mysql实现无限分类实例详解
  6. 继续聊WPF——动态数据模板
  7. WebLogic常见问题
  8. 照片转换为动画 html5,如何使用html5让图片转圈的动画效果
  9. [译]发布ABP v0.19包含Angular UI选项
  10. 【Linux】X window与文本模式的切换
  11. kaldi 声纹识别系统(1)原理解析:基于x-vector
  12. 体检预约系统软件测试计划书,体检中心-管理软件需求分析.doc
  13. 如何修改ns服务器,Godaddy如何修改NS信息
  14. 情绪识别(python opencv dlib)
  15. cdrx8如何批量导出jpg_CDR怎么批量导出图片
  16. 架构基础 - WAL在各种数据系统的应用
  17. gshhs matlab,matlab的mmap
  18. Redis——热点key问题
  19. 【UGUI】Unity4.6 UI按钮绑定事件(四)
  20. 钢笔朝花夕拾录————一位钢笔玩家的入坑至出坑心路历程

热门文章

  1. 麒麟子Cocos Creator 3D研究笔记十:【qfw】开源的Extension Pack for Cocos Creator 3D
  2. 全民小视频逆势崛起:短视频的“小趋势”与“信用飞轮”
  3. js 实现统计网站访问量
  4. VSCode远程连接ubuntu服务器
  5. 如何提高学习欲--奖励机制
  6. 神经网络知识点汇总——FNN
  7. 网易云音乐 ios android 通用,网易云游戏苹果和安卓不通用吗 | 手游网游页游攻略大全...
  8. STL--函数对象学习
  9. 压测学习总结(1)——高并发性能指标:QPS、TPS、RT、吞吐量详解
  10. ae-概述、流程、菜单01