iOS优化-启动优化

测量启动过程的耗时

当按下home键的时候,App进程并不会马上被干掉,还会在后台存活一定时间。在这个时间内如果再次回到App那么几乎不需要做什么,就可以还原到退出前的状态。这种持续存活的情况下启动App,我们称为热启动,相对而言冷启动就是App被kill掉以后一切从头开始启动的过程。

测量main()函数之前的启动时间

苹果已经提供了这个测量方式

在Xcode的菜单中选择Project→Scheme→Edit Scheme,然后找到Run → Environment Variables,为项目添加环境变量DYLD_PRINT_STATISTICS值为YES

这样Xcode在启动App后会在控制台输出启动耗时

虚拟内存和物理内存

早期计算机没有虚拟内存这个问题,所有的地址都是实实在在的物理地址。当应用加载到内存中时,是全部加载到内中。内存的访问都是直接访问物理内存地址,这样极其不安全。然后就是很多时候一个应用真正只是用到少量的内存,这样就存在内存的浪费。因此出现了虚拟内存,让每个应用在逻辑上存在一大片连续的虚拟内存,每个进程的虚拟内存对应一个映射表,映射到实际的物理内存上。

那么cpu在访问这个进程的时候,先通过虚拟地址寻址,然后转换为对应的物理地址(地址翻译,这需要对应的硬件--cpu的内存管理单元mmu与操作系统配合)。

也就是说,进程中使用的地址是一片单独连续的虚拟地址,通过进程映射表(页表)映射到物理内存中,这时候进程在物理内存上占用的空间不一定是连续的。这样就解决了安全和物理内存使用率的问题。

内存分页

进程有自己的虚拟内存,但是物理内存实际也没有增大,这时候要解决内存的使用效率。

进程自己对应的映射表是以页为单位,在macOS上是以4KB一页为单位,iOS是以16KB为单位。(终端输入PAGESIZE可以查看到macOS的分页大小)。

如何解决内存浪费的?

应用程序加载到内存中时,并不会全部加载到物理内存中,属于懒加载,用哪一部分就加载那一部分。当访问进程的内存地址时,首先看页表,查看所要访问的对应页表是否已经加载到内存中。如果这一页没有在物理内存中时,操作系统会阻塞当前进程,发出一个缺页异常/缺页中断(pagefault),让后将磁盘中对应页的数据加载到内存中,完成虚拟内存和物理内存的映射。

当前进程的页表数据加载到物理内存中时,不一定是连续的,也有可能会覆盖其他进程的不活跃页,这样的按需分配,极大提高内存的使用效率。

虚拟内存的安全问题

虚拟内存通过页表映射到物理内存上,因此直接访问物理地址并不能实际正确的拿到进程的数据,但是进程的虚拟内存地址相对于自己来说也是绝对的,不管程序运行多少次,如果访问同一个函数,它在虚拟内存中的地址都是一样的这样也存在安全问题(比如直接静态注入)。

这样也出现了新的技术--ASLR(Address Space Layout Randomization)。

每次虚拟内存在加载之前,都加一个随机偏移值。iOS好像是从4.3版本开始了。

二进制重排(clang插桩实现二进制重排

缺页中断/缺页异常:内存分页管理,每一页加载的时候都会发生。

在iOS中,在加载缺页内存的时候,不仅发生缺页阻塞从磁盘中加载数据,还要对加载的这页做签名的验证

在使用中,我们一般感受不到这个过程,但是在启动中,这个过程也许你能很好的体会过。启动时,程序有大量的代码需要加载、执行,那么这个缺页中断有可能就很明显了。

如何优化?

假如我的app需要加载10页内存,但是启动的时候需要加载的代码放在1、3、5页。这时候来看看,代码在mac-o文件中的位置是根据文件加载生成的顺序来决定。那么这时候app启动需要运行的代码放在3个虚拟内存页中就需要出现3次pagefault。

如果我们那需要启动时用的代码全部放在前面1-2页中,甚至如果代码足够小只需要1页就够了,这样极大减少进程的阻塞。这也就是二进制重排。

查看pagefault

Xcode提供相关的调试工具,使用自带的instruments查看MainThread中虚拟内存的file backed page in项目,它代表着启动时,产生的pagefault次数。

二进制重排的优化是发生在编译链接阶段,对即将生成的二进制可执行文件进行重排。

xcode使用的连接器叫ld它可以指向一个order_file文件,在这个文件中指定排列符号,那么Xcode在编译时会按照指定的排列编译出可执行的文件,苹果自己也是这么用的。


虚拟内存工作原理

引用了虚拟内存后 , 在我们进程中认为自己有一大片连续的内存空间实际上是虚拟的 , 也就是说从0x000000 ~ 0xffffff我们是都可以访问的 . 但是实际上这个内存地址只是一个虚拟地址 , 而这个虚拟地址通过一张映射表映射后才可以获取到真实的物理地址 .

什么意思呢 ?

实际上我们可以理解为 , 系统对真实物理内存访问做了一层限制 , 只有被写到映射表中的地址才是被认可可以访问的 .

例如 , 虚拟地址0x000000 ~ 0xffffff这个范围内的任意地址我们都可以访问 , 但是这个虚拟地址对应的实际物理地址是计算机来随机分配到内存页上的 .

这里提到了实际物理内存分页的概念 , 下面会详细讲述 .

(可能大家也有注意到 , 我们在一个工程中获取的地址 , 同时在另一个工程中去访问 , 并不能访问到数据 , 其原理就是虚拟内存 .)

整个虚拟内存的工作原理这里用一张图来展示 :







1、查找没有使用的文件,需要删除(用脚本工具)

2、






参考:https://www.jianshu.com/p/9ba858461e6d

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容