android虚拟机的垃圾收集
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虚拟机的垃圾收集的更多相关文章
- 理解Android虚拟机体系结构
1 什么是Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的 ...
- 理解Android虚拟机体系结构(转)
1 什么是Dalvik虚拟机 Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的 ...
- 《深入理解Java虚拟机》垃圾收集器
说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物.事实上,GC的历史远比Java久远,1960年诞生于MIT的Lisp是第一门真正使用内存动态 ...
- Android虚拟机中的sqlite数据库文件
Android虚拟机中的sqlite数据库文件 ①
- Android 虚拟机Dalvik、Android各种java包功能、Android相关文件类型、应用程序结构分析、ADB
Android虚拟机Dalvik Dalvik冲击 随着Google 的AndroidSDK 的发布,关于它的API 以及在移动电话领域所带来的预期影响这些方面的讨论不胜枚举.不过,其中的一个话题在J ...
- Android虚拟机GenyMotion
GenyMotion:需要VirtualBox,安装后可以选择机型,这个应该是Android for x86的一个改进版虚拟机,在原版的基础上针对不同机型用了和原机型同样的GUI,但是发现缺少了Goo ...
- Dalvik虚拟机的垃圾收集机制
垃圾收集机制是Java虚拟机共有的特性, 这里介绍Dalvik虚拟机的垃圾收集机制特点. 在android2.3之前,有以下几个特点: 1. 垃圾收集线程在执行的时候,其它线程都停止. 2. 一次 ...
- 使用HAXM加速Android虚拟机
Android虚拟机在支持Intel VT技术的CPU上,可以使用HAXM(Hardware Accelerated Execution Manager)得到硬件加速支持,使得虚拟机运行速度得到极大提 ...
- 自己写的书《深入理解Android虚拟机内存管理》,不出版只是写着玩
百度网盘地址:https://pan.baidu.com/s/1jI4xZgE 我给起的书名叫做<深入理解Android虚拟机内存管理>.本书分为两个部分,前半部分主要是我对Linux0. ...
随机推荐
- CentOS 6.5下安装Oracle 11g(转)
最近开始学习CentOS使用,做些记录. 参考文献:Cent OS 6_5(x86_64)下安装Oracle 11g 一.硬件要求 1.内存&swap Minimum:1 GB of RAM ...
- 模仿VIMD的模式的简化代码示例
按numpad0来切换模式,按t显示不同的结果: Numpad0:: tfmode:=!tfmode aaa:=(tfmode=?"AAAA":"BBBB") ...
- Spring MVC @ResponseBody和@RequestBody使用
@ResponseBody用法: 作用:该注解用于将Controller的方法返回的对象,根据HTTP Request Header的Accept的内容,通过适当的HttpMessageConvert ...
- selenium笔记2017
1,from time import sleep(先引入关键词) sleep(5) (就可以使用这个命令了) 可以停止页面5秒 1-1. 等待页面元素出现的时间(即没出现时,等待元素出现) ...
- MacBook设置定时关机
Mac定时关机.重启.休眠命令行 - 有梦想的蜗牛 - 博客频道 - CSDN.NET http://blog.csdn.net/showhilllee/article/details/4406727 ...
- servlet中获取配置文件中的参数.
web.xml (添加init-param) <?xml version="1.0" encoding="UTF-8"?> <web-app ...
- Java遍历一个目录下的所有文件
Java遍历一个目录下的所有文件 Java工具中为我们提供了一个用于管理文件系统的类,这个类就是File类,File类与其他流类不同的是,流类关心的是文件的内容,而File类关心的是磁盘上文件的存 ...
- python之解析csv
使用csv包 读取信息 csvfile = file('csv_test.csv', 'rb') reader = csv.reader(csvfile) for line in reader: pr ...
- extjs [1]
1.JS 类的声明,和对象的创建 2.原始方法用EXTJS创建一个window 3.利用一个按钮触发window窗体,了解一下EXTJS的事件机制 4.用EXTJS4.0的create来创建windo ...
- 1 数据库开发--MySQL介绍
1.数据库管理软件 C/S 并发.锁 :SQL语句.语法 基本管理和语法学习 一.介绍: mysql数据库管理软件: 套接字:服务端,客户端:客户端可访问服务端得数据 1.支持并发:操作得是共享得数据 ...