整理自2019.12.15 Unity UUG北京的演讲 讲师:高川(Unity大中华区企业技术支持经理)
什么是内存
-
物理内存
1.CPU访问内存是一个慢速过程
因此会使用cache来加速访问,大家可以留意CPU的板载示意图,占据最大面积的是Cache模块,如下图
CPU如果在Cache中没有找到数据,称为一次Cache Missing,如果内存数据 指令是不连续的,会导致大量的Cache Missing
2.Unity的ECS和DOTS的目的之一就是提高内存的连续性,减少Cache Missing
3.台式设备与移动设备的内存架构差异很大
4.目前很多厂商提出手游端游化,但是需要注意的是,在技术上是不可能的(注:应该可以理解为使用的优化策略不同)
5.移动设备没有独立显卡以及显存,有的时候,你的内存使用并不大,但还是会内存溢出,例如在Android上,可以看一下有没有OpenGL的out of memory的log,这意味这显存使用太大了
6.CPU板上面积更小,缓存级数更少,大小也更小,例如一台台式机,L3的大小为8-16M,而移动的CPU,例如骁龙845,只有2M,Cache Missing的概率更大 -
虚拟内存
1.内存交换
移动设备不支持内存交换(注:就是把部分物理内存中的数据保存在硬盘上),谷歌的解释是移动设备和台式设备的IO速度是不一样的,因此移动设备在做内存交换的时候会耗费大量的时间在IO上,并且移动设备的存储介质的可擦写次数和台式设备差距也很大
2.iOS可以进行内存压缩
把不活跃的内存压缩起来,放在特定的内存空间中,以节约物理内存,所以在iOS上可以看到有的时候实际使用的内存比物理内存大很多 -
内存寻址范围
1.32位CPU和64位CPU
严格来说,它们的寻址范围是无法确定谁高谁低的,CPU的位数指的是运算位数,不是MCU位数,只是目前大部分是对应的,即32位CPU对应32位的寻址范围,64位CPU对应64位的寻址范围
Android的内存管理
Android的内存大,但是管理不太好
-
内存的基本单位 Page
1.默认4K一个page(与linux相同),但并不意味是4K对齐的
2.回收和分配以page为单位
3.分为用户态和内核态,常见的一个问题是,用户态中的一个指针越界到内核态,该程序就会挂掉 -
内存管理工具-low memory killer(AKA lmk)
一些现象都和它有关,例如闪退 服务消失 手机重启等
Android内存分为9层,如下图
当内存不足时,killer会从下往上杀应用,当杀到前台(Foreground)时,你的应用就会闪退,如果继续使用内存,会一致杀到System