免费获取面试PDF合集
想要优化Android内存,一些必备的基础知识是不能少的。所以在第一部分,我们先从Application Framework、Dalvik/Art、Linux内核三个部分由浅入深来讲解关于Androd内存相关的知识。
一丶Dalvik内存分配原理简单说一说,年轻代与老年代的区别
Android Dalvik Heap
简介:Android Dalvik Heap与原生Java一样,将堆的内存空间分为三个区域,Young Generation新生代,Old Generation年老代, Permanent Generation持久代。
对象分配过程
:最近分配的对象会存放在新生代区域,新生代区域分为eden区(伊甸园,圣经中指上帝为亚当夏娃创造的生活乐园)、so区和s1区,s1和s0区也被称为from区和to区(合称Survivor区),他们是两块大小相等并且可以互换角色的空间,绝大多数情况下,对象首先分配在eden区,在一次新生代回收后,如果对象还存活会进入s0或者s1区,之后每一次gc,存活的对象年龄都会相应增加,当达到一定年龄则会进入老年代,最后累积一定时间再移动到持久代区域。系统会根据内存中不同的内存数据类型分别执行不同的gc操作。
问题
:GC发生的时候,所有的线程都是会被暂停的。执行GC所占用的时间和它发生在哪一个Generation也有关系,新生代中的每次GC操作时间是最短的,年老代其次,持久代最长。GC时会导致线程暂停、界面卡顿的问题在Android Art中得到了优化。
二丶Dalvik虚拟机执行模式是什么样的
Dalvik垃圾回收过程:GC会去标记和查找所有可访问到的活动对象,这个时候整个程序的线程就会挂起,并且虚拟机内部的所有线程也会同时挂起(左下图) 。之所以要挂起所有线程是确保:所有程序没有进行任何变更,与此同时GC会隐藏所有处理过的对象,最终确保标记了所有需要回收的对象后,GC才会恢复所有线程,并释放空间。
大内存对象分配
:当发现需要给一个较大的对象(蓝色方块)分配空间时,发现可用空间还是够的,但没有这么大的连续空间供新对象使用,这个时候就不得不进行一次GC回收(红色方块,右下图),为大对象腾出较大并且连续的空间。这就是我们在分配一个较大对象的时候非常容易引起丢帧和卡顿的原因之一,所以Android5.0以前大家都认为Android卡顿是因为Darvik虚拟机的效率低下导致的。
总结
:Dalvik虚拟机的三个问题
-
GC时挂起所有线程
-
大而连续的空间紧张
-
内存碎片化严重
三丶ART虚拟机的优化
GC过程:在ART中GC会要求程序在分配空间的时候标记自身的堆栈,这个过程非常短,不需要挂起所有程序的线程.这样就节约了很大一部分时间去查找活动对象。
大内存对象分配
:ART里会有一个独立的LOS供Bitmap使用,从而提高了GC的管理效率和整体性能.
文末
那么对于想坚持程序员这行的真的就一点希望都没有吗?
其实不然,在互联网的大浪淘沙之下,留下的永远是最优秀的,我们考虑的不是哪个行业差哪个行业难,就逃避掉这些,无论哪个行业,都会有他的问题,但是无论哪个行业都会有站在最顶端的那群人。我们要做的就是努力提升自己,让自己站在最顶端,学历不够那就去读,知识不够那就去学。人之所以为人,不就是有解决问题的能力吗?挡住自己的由于只有自己。
Android希望=技能+面试
- 技能
- 面试技巧+面试题
UzvRq9pQ-1643531527100)]
- 面试技巧+面试题
[外链图片转存中…(img-reO9UTdu-1643531527101)]