写点什么

IGG:Android 内存回收机制原理是什么,flutterlistview 滚动卡顿

用户头像
Android架构
关注
发布于: 刚刚

求职者:?如果看了这篇文章,应付下来基本没有多大的问题


更多面试内容,面试专题,flutter 视频 全套,音视频从 0 到高手开发。


关注 GitHub:https://github.com/xiangjiana/Android-MS


免费获取面试 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


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


会隐藏所有处理过的对象,最终确保标记了所有需要回收的对象后,GC 才会恢复所有线程,并释放空间。


大内存对象分配:当发现需要给一个较大的对象(蓝色方块)分配空间时,发现可用空间还是够的,但没有这么大的连续空间供新对象使用,这个时候就不得不进行一次 GC 回收(红色方块,右下图),为大对象腾出较大并且连续的空间。这就是我们在分配一个较大对象的时候非常容易引起丢帧和卡顿的原因之一,所以 Android5.0 以前大家都认为 Android 卡顿是因为 Darvik 虚拟机的效率低下导致的。


总结:Dalvik 虚拟机的三个问题


  1. GC 时挂起所有线程

  2. 大而连续的空间紧张

  3. 内存碎片化严重

三丶 ART 虚拟机的优化

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
IGG:Android内存回收机制原理是什么,flutterlistview滚动卡顿