一、概念
2014年10月16日,Google发布Android 5.0(棒棒糖Lollipop),ART全面取代Dalvik成为Android虚拟机运行环境,至此,Dalvik退出历史舞台。
ART代表Android Runtime,其处理应用程序执行的方式完全不同于Dalvik,Dalvik是使用字节码解释器与JIT即时编译器来执行代码。而ART则是在应用安装时就将字节码编译成本地机器码,这一机制叫Ahead-Of-Time (AOT)编译。
优点:
- 应用程序启动更快。
- 执行更有效率。
缺点:
- 需要更大的存储空间。
- 需要更长的应用安装时间。
- 系统升级时所有应用都需要重新编译。
AOT编译生成的oat文件会引用Framework中的代码,一旦系统发生升级,Framework中的实现发生变化,就需要重新修正所有应用程序的oat文件,使得它们的引用是正确的,这就需要重新编译所有的应用。
二、Dalvik字节码
作为运行时的ART可执行Dalvik可执行文件并遵循dex字节码规范。
在应用程序安装时,ART使用dex2oat工具将dex文件编译成oat格式的文件,oat文件中既包含了dex文件中原先的内容,也包含了已经编译好的本地机器码。
三、AOT编译与JIT即时编译器
AOT编译:
Ahead-of-time(AOT)是相对于Just-in-time(JIT)而言的。JIT是在运行时进行字节码到本地机器码的编译,这也是为什么Java普遍被认为效率比C++差的原因。无论是解释器的解释还是运行过程中即时编译,都比C++编译出的本地机器码执行多了一个耗费时间的过程。而AOT就是向C++编译过程靠拢的一项技术:当APK在安装的时候,系统会通过一个名称为dex2oat的工具将APK中的dex文件编译成包含本地机器码的oat文件存放下来。这样做之后,在程序执行的时候,就可以直接使用已经编译好的机器码以加快效率。
2016年8月22日,Google发布Android 7.0(牛轧糖Nougat),JIT即时编译器回归,形成AOT/JIT混合编译模式。
这种混合编译模式的特点是:
- 应用在安装的时候dex不会被AOT编译。
- 应用在运行时dex文件先通过解释执行,与此同时,热点代码会被识别并被JIT即时编译器编译成本地机器码后存储在jit code cache中,并生成profile文件以记录热点代码的信息。
- 手机进入空闲和充电状态的时候,系统会扫描App目录下的profile文件并执行AOT编译。
可以看出,混合编译模式综合了AOT和JIT的各种优点,使得应用在安装速度加快的同时,运行速度、存储空间和耗电量等指标都得到了优化。
四、指令集架构
同Dalvik虚拟机,基于寄存器架构。
五、垃圾收集器
ART有多个不同的GC方案,这些方案包括运行不同垃圾回收器。默认方案是CMS(并发标记清除)方案。除CMS方案外,当应用将进程状态更改为察觉不到卡顿的进程状态(例如,后台或缓存)时,ART将执行堆压缩。
ART还引入一种基于位图的新内存分配程序,称为RosAlloc。在RosAlloc中,允许在线程本地区域存储小对象,这就避免了全局锁的等待时间,因而性能优于Dalvik虚拟机使用的DlMalloc。