背景

  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整体性能的巨大提升。

PS:

如果喜欢本文,请点击右下角的推荐,欢迎转载!

【原创】【Android】揭秘 ART 细节 ---- Garbage collection的更多相关文章

  1. Python Garbage Collection 与 Objective-C ARC

    转载请注明出处 http://blog.csdn.net/u014205968/article/details/69389363 Python GC 与 Objective-C ARC 提起GC(Ga ...

  2. Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译

    本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...

  3. python垃圾回收机制(Garbage collection)

    由于面试中遇到了垃圾回收的问题,转载学习和总结这个问题. 在C/C++中采用用户自己管理维护内存的方式.自己管理内存极其自由,可以任意申请内存,但也为大量内存泄露.悬空指针等bug埋下隐患. 因此在现 ...

  4. Java垃圾回收机制(Garbage Collection)

    引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...

  5. 深入理解Java中的Garbage Collection

    前提 最近由于系统业务量比较大,从生产的GC日志(结合Pinpoint)来看,需要对部分系统进行GC调优.但是鉴于以往不是专门做这一块,但是一直都有零散的积累,这里做一个相对全面的总结.本文只针对Ho ...

  6. How Garbage Collection Really Works

    Java Memory Management, with its built-in garbage collection, is one of the language's finest achiev ...

  7. Java Garbage Collection Basics--转载

    原文地址:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html Overview Purpose ...

  8. AutoReleasePool 和 ARC 以及Garbage Collection

    AutoReleasePool autoreleasepool并不是总是被auto 创建,然后自动维护应用创建的对象. 自动创建的情况如下: 1. 使用NSThread的detachNewThread ...

  9. [翻译]Java垃圾收集精粹(Java Garbage Collection Distilled)

    source URL: http://www.infoq.com/articles/Java_Garbage_Collection_Distilled Name: Java Garbage Colle ...

随机推荐

  1. Python3执行DOS命令并截取其输出到一个列表字符串,同时写入一个文件

    #执行DOS命令并截取其输出到一个列表字符串,同时写入一个文件#这个功能很有用listing=os.popen('ipconfig').readlines()for i in listing: pri ...

  2. leetcode621

    public class Solution { public int LeastInterval(char[] tasks, int n) { Dictionary<char, int> ...

  3. SQL Server中有关约束(constraint)的一些细节

    本文出处:http://www.cnblogs.com/wy123/p/7350265.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  4. Python中的logging模块【转】https://www.cnblogs.com/yelin/p/6600325.html

    [转]https://www.cnblogs.com/yelin/p/6600325.html 基本用法 下面的代码展示了logging最基本的用法. 1 # -*- coding: utf-8 -* ...

  5. 转 - spring security oauth2 password授权模式

    原贴地址: https://segmentfault.com/a/1190000012260914#articleHeader6 序 前面的一篇文章讲了spring security oauth2的c ...

  6. git tag的用法

    我们常常在代码封板时,使用git 创建一个tag ,这样一个不可修改的历史代码版本就像被我们封存起来一样,不论是运维发布拉取,或者以后的代码版本管理,都是十分方便的 git的tag功能 git 下打标 ...

  7. AltiumDesigner印制导线的走向及形状

    印制导线的走向及形状.在PCB布线时,相邻层的走线方向成正交结构,应避免将不同的信号线在相邻走成同一方向,以减少不必要的层间窜扰.当PCB布线受到结构限制(如某种背板)难以避免出现平行布线时,特别是当 ...

  8. [leetcode]37. Sudoku Solver 解数独

    Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy  ...

  9. 记一次SQL性能优化,查询时间从4000ms优化到200ms.

    以下这句SQL是从PLM中获取代办工作流的.没优化前SQL语句执行一次大概4000ms(4秒). select ch.change_number changeNumber, f.text change ...

  10. Linux top命令中CPU信息的详解(转)

    add by zhj: 下面的文章解释的很好了,这里再说明一下top命令中wa的含义,我们知道,当IO阻塞时,操作系统会把进程改为阻塞态,将CPU调度到运行其它进程. CPU在空闲状态下,会检查是否有 ...