ART虚拟机是Android4.4发布的,用来替代Dalvik虚拟机在Android5.0版本默认启用ART。
ART与DVM的区别
- 1、DVM中的应用每次运行时,字节码都需要通过JIT编译器编译为机器码,而ART中,系统在安装应用程序时会进行一次AOT(ahead of time compilation,预编译),将字节码预先编译成机器码并存储在本地,这样程序在每次运行时就不需要执行编译了,运行效率会大大提升,设备耗电也会降低。采用AOT有两个主要缺点:一是应用程序安装时间变长,尤其是一些复杂的应该,二是字节码预先编译成机器码,机器码需要的存储空间更大
为解决上面的问题,Android7.0ART加入了即时编译器JIT,作为AOT的补充,在安装应用程序时并不会将字节码全部编译成机器码,而是在运行中将热点代码编译成机器码,从而缩短应用的安装时间并节省了存储空间。 - 2、DVM是32位CPU设计,ART支持64位并兼容32位处理器。
- 3、ART对垃圾回收机制进行了改进,更频繁地执行垃圾收集,将GC暂停由2次减少为1次。
ART的运行时堆
与DVM的GC不同,ART采用了多种垃圾收集方案,每个方案会运行不同的垃圾收集器,默认采用了CMS(Concurrent Mark-Sweep)方案,该方案使用sticky-CMS和parital-CMS。根据不同的CMS方案,ART的运行时堆的空间分配也不同,默认是由4个Space和多个辅助数据结构组成,4个Space分别为Zygote Space、Allocation Space、Image Space和Large Object Space。Zygote Space、Allocation Space和DVM的作用是一样的,Image Space 用来存放一些预加载类,Large Object Space用来分配一些大对象(默认大小为12KB),其中Zygote Space和Image Space是进程间共享的。采用标记-清除算法,处理这个四个Space,ART的Java堆中还包括两个Mode Union Table,一个Card Table,两个Heap Bitmap,两个Object Map,以及三个Object Stack。
垃圾收集器
- Concurrent Mark Sweep(CMS):CMS收集器是一种以获取最短收集暂停时间为目标的收集器,采用了标记-清除算法实现。它是完整的堆垃圾收集器,能释放除了Image Space空间外所有的空间
- Concurrent Partial Mark Sweep:部分完整的堆垃圾收集器,能释放除了Image Space和Zygote Space外的所有空间
- Concurrent Sticky Mark Sweep:粘性收集器,基于分代的垃圾收集思想,它只能释放自上次GC以来分配的对象。这个垃圾收集器比一个完整的或者部分的垃圾收集器扫描的更频繁,因为它更快并且有更短的暂停时间
- Marksweep+Semispace:非并发的GC,复制GC用于堆转换以及齐性空间压缩(堆碎片整理)。
参考资料
- Android进阶解密. 刘望舒。