ART、JIT、AOT、Dalvik之间有什么关系?

JIT与Dalvikandroid

JIT是"Just In Time Compiler"的缩写,就是"即时编译技术",与Dalvik虚拟机相关。缓存

怎么理解这句话呢?这要从Android的一些特性提及。工具

JIT是在2.2版本提出的,目的是为了提升Android的运行速度,一直存活到4.4版本,由于在4.4以后的ROM中,就不存在Dalvik虚拟机了。优化

咱们使用Java开发android,在编译打包APK文件时,会通过如下流程翻译

  • Java编译器将应用中全部Java文件编译为class文件
  • dx工具将应用编译输出的类文件转换为Dalvik字节码,即dex文件

以后通过签名、对齐等操做变为APK文件。code

Dalvik虚拟机能够看作是一个Java VM,他负责解释dex文件为机器码,若是咱们不作处理的话,每次执行代码,都须要Dalvik将dex代码翻译为微处理器指令,而后交给系统处理,这样效率不高。开发

为了解决这个问题,Google在2.2版本添加了JIT编译器,当App运行时,每当遇到一个新类,JIT编译器就会对这个类进行编译,通过编译后的代码,会被优化成至关精简的原生型指令码(即native code),这样在下次执行到相同逻辑的时候,速度就会更快。编译器

固然使用JIT也不必定加快执行速度,若是大部分代码的执行次数不多,那么编译花费的时间不必定少于执行dex的时间。Google固然也知道这一点,因此JIT不对全部dex代码进行编译,而是只编译执行次数较多的dex为本地机器码。虚拟机

有一点须要注意,那就是dex字节码翻译成本地机器码是发生在应用程序的运行过程当中的,而且应用程序每一次从新运行的时候,都要作重作这个翻译工做,因此这个工做并非一劳永逸,每次从新打开App,都须要JIT编译。编译

另外,Dalvik虚拟机从Android一出生一直活到4.4版本,而JIT在Android刚发布的时候并不存在,在2.2以后才被添加到Dalvik中。

ART与AOT

AOT是"Ahead Of Time"的缩写,指的就是ART(Anroid RunTime)这种运行方式。

前面介绍过,JIT是运行时编译,这样能够对执行次数频繁的dex代码进行编译和优化,减小之后使用时的翻译时间,虽然能够加快Dalvik运行速度,可是仍是有弊病,那就是将dex翻译为本地机器码也要占用时间,因此Google在4.4以后推出了ART,用来替换Dalvik。

在4.4版本上,两种运行时环境共存,能够相互切换,可是在5.0+,Dalvik虚拟机则被完全的丢弃,所有采用ART。

ART的策略与Dalvik不一样,在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。以后打开App的时候,不须要额外的翻译工做,直接使用本地机器码运行,所以运行速度提升。

固然ART与Dalvik相比,仍是有缺点的。

  • ART须要应用程序在安装时,就把程序代码转换成机器语言,因此这会消耗掉更多的存储空间,但消耗掉空间的增幅一般不会超过应用代码包大小的20%
  • 因为有了一个转码的过程,因此应用安装时间不免会延长

可是这些与更流畅的Android体验相比而言,不值一提。

总结

经过前面背景知识的介绍,我终于能够更简单的介绍这四个名词之间的关系了:

  • JIT表明运行时编译策略,也能够理解成一种运行时编译器,是为了加快Dalvik虚拟机解释dex速度提出的一种技术方案,来缓存频繁使用的本地机器码
  • ART和Dalvik都算是一种Android运行时环境,或者叫作虚拟机,用来解释dex类型文件。可是ART是安装时解释,Dalvik是运行时解释
  • AOT能够理解为一种编译策略,即运行前编译,ART虚拟机的主要特征就是AOT
相关文章
相关标签/搜索