Dalvik :http://zh.wikipedia.org/wiki/Dalvik%E8%99%9A%E6%8B%9F%E6%9C%BA

  ART :http://source.android.com/devices/tech/dalvik/art.html

  正文

  Ian Rogers  在Google IO 2014上讲述了 The ART runtime 的Garbage Collection部分,通过他的讲述,我们可以了解到ART在垃圾回收方面有哪些改进的地方。开门见山,下面我们就来了解一下具体的细节:

  首先来看一下GC在Dalvik里是如何工作的:

         图1 :  GC的过程

             图2 :挂起所有线程进行标记,垃圾回收以释放空间

  从图1可以看到当Dalvik开始垃圾回收时,GC会去查找所有活动的对象,这个时候整个程序的线程就会挂起,并且虚拟机内部的所有线程也会同时挂起(图2) ,这样目的是在较少的堆栈里找到所引用的对象。需要注意的是这个回收动作是和应用程序同时执行。

  这里之所以要挂起所有线程是确保所有程序没有进行任何变更,与此同时GC会隐藏所有处理过的对象,最终,确保标记了所有需要回收的对象后,GC才会恢复所有线程,并释放空间。

  因此在Dalvik里,挂起所有线程这个动作的优先级非常高,在内存紧张的时候就会频繁执行这个动作,这样就会造成丢帧,界面卡顿的现象。

        图3 : 为什么Dalvik 里的GC这么挫?

  从图3可以看到,当发现需要给一个较大的对象(蓝色方块)分配空间时,发现可用空间还是够的,但没有这么大的连续空间供新对象使用,这个时候就不得不进行一次GC回收(红色方块)(图3),为大对象腾出较大并且连续的空间。这就是我们在分配一个较大对象的时候非常容易引起丢帧和卡顿的原因之一。解决方案可以是:把较大对象分解成几个较小的对象再进行初始化,但这解决不了根本问题。

  上图我们还可以用一个现实中比较形象的小区停车现象来阐释:一辆较长的汽车A(蓝色方块)来找车位,发现空的位置很多,但车与车之间的间距较大,没有适合A汽车停的位置,这个时候就不得不让车位管理员M(GC)去查找确认是否有非本小区的车辆(红色方块)并回收车位,供A汽车使用。(这里我们可以发现,如果车停得够紧凑,就无需麻烦车位管理员)

  通过上面3张图我们可以看到Dalvik中GC的问题如下:

  1. GC时挂起所有线程

  2. 大而连续的空间紧张

  3. 内存碎片化严重

  下面我们来了解一下ART是如何解决这些问题的:

                  图4 在ART中不需要挂起所有程序的线程

  这里可以对比着图1一起看,在ART中GC会要求程序在分配空间的时候标记自身的堆栈,这个过程非常短,不需要挂起所有程序的线程.这样就节约了很大一部分时间去查找活动对象。(解决问题1)

        图5  提供 LOS :large object space 专供Bitmap使用

  从图5可以看到,ART里会有一个独立的LOS供Bitmap使用,从而提高了GC的管理效率和整体性能。

  同样我们从小区停车现象理解:小区里划出了一块大车专用的区域,使得大车省去了找车位的时间,也减少了通知管理员M(GC)的次数。(解决问题2)

              图6 ART中的 moving collector

  在ART里还会有一个moving collector来压缩活动对象(绿色方块),使得内存空间更加紧凑。

  从小区停车现象理解:车位管理员M会定期移动停得不规范的车,使得停车空间更加紧凑,最大化利用有效空间。(解决问题3)

  在解决了以上三个问题之后,ART就具备了以下优点:

  1.更少的内存碎片

  2.更短更少的中断和阻塞

  3.更低的内存使用率

  总结 :Google在ART里对GC做了非常大的优化,从演示的数据里看,内存分配的效率提高了10倍,GC的效率提高了2-3倍。主要是通过标记时机的变更使中断和阻塞的时间更短;通过LOS解决大对象的内存分配和存储问题;通过moving collector来压缩内存,使内存空间更加紧凑,从而达到GC整体性能的巨大提升。

android虚拟机的垃圾收集的更多相关文章

  1. 理解Android虚拟机体系结构

    1 什么是Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的 ...

  2. 理解Android虚拟机体系结构(转)

    1 什么是Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的 ...

  3. 《深入理解Java虚拟机》垃圾收集器

    说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态 ...

  4. Android虚拟机中的sqlite数据库文件

    Android虚拟机中的sqlite数据库文件 ①

  5. Android 虚拟机Dalvik、Android各种java包功能、Android相关文件类型、应用程序结构分析、ADB

    Android虚拟机Dalvik Dalvik冲击 随着Google 的AndroidSDK 的发布,关于它的API 以及在移动电话领域所带来的预期影响这些方面的讨论不胜枚举.不过,其中的一个话题在J ...

  6. Android虚拟机GenyMotion

    GenyMotion:需要VirtualBox,安装后可以选择机型,这个应该是Android for x86的一个改进版虚拟机,在原版的基础上针对不同机型用了和原机型同样的GUI,但是发现缺少了Goo ...

  7. Dalvik虚拟机的垃圾收集机制

    垃圾收集机制是Java虚拟机共有的特性, 这里介绍Dalvik虚拟机的垃圾收集机制特点. 在android2.3之前,有以下几个特点: 1.  垃圾收集线程在执行的时候,其它线程都停止. 2.  一次 ...

  8. 使用HAXM加速Android虚拟机

    Android虚拟机在支持Intel VT技术的CPU上,可以使用HAXM(Hardware Accelerated Execution Manager)得到硬件加速支持,使得虚拟机运行速度得到极大提 ...

  9. 自己写的书《深入理解Android虚拟机内存管理》,不出版只是写着玩

    百度网盘地址:https://pan.baidu.com/s/1jI4xZgE 我给起的书名叫做<深入理解Android虚拟机内存管理>.本书分为两个部分,前半部分主要是我对Linux0. ...

随机推荐

  1. Advanced Installer 换产品ID,生成文件名

    换生成名: -

  2. java之Jsch实现Linux的文件上传与下载

    一.JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功 ...

  3. M3截止阶段小结

    python知识点总结1.copy模块中深浅拷贝copy() deepcopy()2.__new__ 方法参数    def __new__(cls, *args, **kwargs):        ...

  4. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #12 使用Memory Cgroup限制内存使用量

    HACK #12 使用Memory Cgroup限制内存使用量 Memory Cgroup是Cgroup的资源限制功能之一,可以控制特定进程可以使用的内存量.Memory CgroupMemory C ...

  5. web开发,click,touch,tap事件浅析

    一.click 和 tap 比较 两者都会在点击时触发,但是在手机WEB端,click会有 200~300 ms,所以请用tap代替click作为点击事件. singleTap和doubleTap 分 ...

  6. Django ORM-02

    6.ForeignKey 相关操作 1.正向查找 正向查找:那么什么是正向查找,我们知道对于一对多或者多对一的情况,我们一般将ForeignKey设置在多的一边,比如我们的书籍与出版社一般是多对一的, ...

  7. 「小程序JAVA实战」小程序视频播放的时候生命周期的控制(56)

    转自:https://idig8.com/2018/09/23/xiaochengxujavashizhanxiaochengxushipinbofangdeshihoushengmingzhouqi ...

  8. vs2015 新特性

    vs2015 新特性 自动属性的增强 http://www.kwstu.com/ArticleView/manong_201411200854239378

  9. Vue cli 脚手架使用

    1:基本的安装 安装node 安装npm Windows 更改环境变量 重启 环境变量生效 安装vue-cli 安装webpack 2:项目构建 https://segmentfault.com/a/ ...

  10. SC命令安装window服务

    sc create Styler binpath= "D:\Styler\Styler.exe" start= auto displayname= "Styler&quo ...