【原创】【Android】揭秘 ART 细节 ---- Garbage collection
背景
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的更多相关文章
- Python Garbage Collection 与 Objective-C ARC
转载请注明出处 http://blog.csdn.net/u014205968/article/details/69389363 Python GC 与 Objective-C ARC 提起GC(Ga ...
- Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译
本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- python垃圾回收机制(Garbage collection)
由于面试中遇到了垃圾回收的问题,转载学习和总结这个问题. 在C/C++中采用用户自己管理维护内存的方式.自己管理内存极其自由,可以任意申请内存,但也为大量内存泄露.悬空指针等bug埋下隐患. 因此在现 ...
- Java垃圾回收机制(Garbage Collection)
引用博客地址:http://www.cnblogs.com/ywl925/p/3925637.html 以下两篇博客综合描述Java垃圾回收机制 第一篇:说的比较多,但是不详细 http://www. ...
- 深入理解Java中的Garbage Collection
前提 最近由于系统业务量比较大,从生产的GC日志(结合Pinpoint)来看,需要对部分系统进行GC调优.但是鉴于以往不是专门做这一块,但是一直都有零散的积累,这里做一个相对全面的总结.本文只针对Ho ...
- How Garbage Collection Really Works
Java Memory Management, with its built-in garbage collection, is one of the language's finest achiev ...
- Java Garbage Collection Basics--转载
原文地址:http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html Overview Purpose ...
- AutoReleasePool 和 ARC 以及Garbage Collection
AutoReleasePool autoreleasepool并不是总是被auto 创建,然后自动维护应用创建的对象. 自动创建的情况如下: 1. 使用NSThread的detachNewThread ...
- [翻译]Java垃圾收集精粹(Java Garbage Collection Distilled)
source URL: http://www.infoq.com/articles/Java_Garbage_Collection_Distilled Name: Java Garbage Colle ...
随机推荐
- Node Sass does not yet support your current environment解决办法
在React项目中,使用了sass.之前运行的好好的,今天突然报错,提示当前环境不支持sass模块,然后就百度了下,发现有相同问题的.原来问题是之前开发时node是6.x的版本,几天前更新到最新10. ...
- 微擎系统jssdk系统快速签名变量
jssdkconfig = {php echo json_encode($_W['account']['jssdkconfig']);} || { jsApiList:[] }; jssdkco ...
- SpringBoot打成jar包的配置方式
pom.xml中添加Springboot插件 <build> <plugins> <plugin> <groupId>org.springframewo ...
- 20175314 《Java程序设计》第四周学习总结
20175314 <Java程序设计>第四周学习总结 教材学习内容总结 每个子类只能有一个父类,而一个父类可以有多个子类.可以使用关键字extends来定义一个类的子类:class 子类名 ...
- SpriteKit 关于categoryBitMask collisionBitMask contactTestBitMask 遇到的一些问题
手写copy一下官方解释 首先是categoryBitMask /** 定义了这个物理刚体是属于哪个类别的掩码 .在一个场景中的每个物理刚体可以分配给达到 32 不同的类别(参数 int bitmas ...
- 281. Zigzag Iterator z字型遍历
[抄题]: Given two 1d vectors, implement an iterator to return their elements alternately. Example: Inp ...
- eclipse 安装lombok插件
下载lombok 下载地址:https://projectlombok.org/downloads/lombok.jar 或者访问官网下载 https://projectlombok.org/ 安装 ...
- faiss学习
faiss 学习 github wiki 介绍 Faiss:Facebook开源的相似性搜索类库 安装 在Mac系统编译安装Faiss faiss教程跟进--Makefile 编译 faiss安装 m ...
- 3P - Snooker
background: Philip likes to play the QQ game of Snooker when he wants a relax, though he was just a ...
- python 函数进阶与闭包
函数的命名空间和作用域 引言 现在有个问题,函数里面的变量,在函数外面能直接引用么? def func1(): m = 1 print(m) print(m) #这行报的错 报错了: NameErro ...