“手机内存越大,运行速度越快”这个观点似乎已经在大家的心里根深蒂固很久了。宏观上看,内存越大,可以被存放的数据越多,存储器件上需要读取的数据量也会随之下降。但是内存大了之后,为什么还是会有卡顿现象呢?这就要从内存数据类型与管理方式上说起。
一类是文件类型数据(或叫文件页数据),其中包含了图片数据,文件数据,程序执行的代码文件等等。另一类是匿名类型数据(或叫匿名页数据),主要存放代码执行过程的临时变量数据(为啥叫匿名啊?因为匿名页数据没来源啊,惨~)。
文件页数据多数为只读数据,同时在存储器件上有备份。因此,内存管理机制喜欢回收文件页数据(没办法呢,欺负弱小嘛)。
匿名页数据都是程序运行时产生的,一旦丢了就没有了,所以匿名页数据的地位高一些。当然强大的内存管理者也不会放任匿名页这个家伙慢慢做大,在手机平台上,就采用了数据压缩的方式,把匿名页数据压缩,节省内存空间。
从回收手段上看,文件页数据在没有弄脏的(有脏数据)情况下丢掉就好了,回收的成本比较低,可以近似看成是空闲的内存。咱们手机上清后台时候看到的可用内存其实就是文件页数据加上内存空闲空间的总和。所以,当你看到可用内存很多,但是还是有卡顿感觉的时候,不要诧异哦。因为那是算了文件页面之后的内存统计量,并不是完全空闲的内存统计量。
那么兄弟们肯定要问了,反正前面说文件页面的回收速度很快嘛,所以可用内存高,程序运行应该也很快啊。这里就涉及到一个关键问题了,文件页面回收真的没有开销吗?
第一种情况,已经被扔掉的文件页面数据,短期内可能不会用到了,这个时候确实扔掉文件数据性能会好。
但第二种情况下,如果扔掉的文件页很快就会用到呢?这个时候,这些数据就要从存储器件重新读取,这个开销可是不小。这个就像是你去银行贷款,乍一看你似乎很快拿到了很多的钱,但是由于这个东西是有利息的,随着你借的钱越多,那么你还的利息就要越多。如果还不上,你就可能去别的银行借钱(影响别的程序执行)。最后就会由于钱还不上,就把系统卡住了,这里利息就是IO开销。
既然回收文件页面有这个风险,那就走匿名页回收嘛,一个想法油然而生从心底想起。匿名页回收需要进行数据压缩。“来来来,交给我”CPU在旁边摇旗呐喊,目前数据压缩需要使用占用一部分CPU算力。当然,以现在的CPU算力来看,数据压缩对用户性能的影响是微乎其微的。然而,这玩意费电啊,同时,手机也烫手啊。为了能够尽快的把数据压缩出来,CPU跟打了鸡血一样,把自己调整成高频状态,尽快完成工作。
哎,终于了解研发人员的痛苦了吧?但是研发人员是不会也不能向困难屈服!现在就给大家介绍下EMUI 10的智能内存管理引擎的工作原理。
夹缝中需求最优解,引入器件性能评价体系,将存储器件性能,CPU性能功耗纳入考量范围,动态调节内存回收机制,平衡文件页与匿名页数据回收比例。在硬件内存配置降低场景下,也能确保流畅的用户体验,大幅降低由于内存供给不足或者内存浪费带来的系统性能二次创伤。
首次加入软件特征识别模块,能够在线识别软件访存行为的特征,针对访存的连续性,Burst 特性与访存混合比例构建内存行为模型,为不同的应用提供精准的内存供给。
同时,为了提升内存的利用率,智能内存管理引擎在线识别数据的冷热特性,能够将长期未使用的数据进行聚拢,并剔除内存。程序对数据的访问就像人对周围事物的感知一样,多数事物都是只图一时新鲜。而这些一时新鲜的东西却会占用手机的内存,不断消耗着内存那脆弱的心灵。智能内存管理引擎提供冷热数据解析功能,替您识别并剔除路边野花。让您在手机道路上流畅无阻。
除此之外,综合考虑存储器件与内存空间之间的权衡,结合应用启动的文件访问特性,实现了在线自学习的文件预读机制,以最小的代价,完成文件页数据的高速加载。总而言之,就是用起来爽~
内存管理是个硬骨头,但是谁让我们就是技术狗呢,就是爱啃硬骨头!