JIT,Just-in-time,即时编译,边运行边编译;html
AOT,Ahead Of Time,提早编译,指运行前编译。java
区别
这两种编译方式的主要区别在因而否在“运行时”进行编译性能
优劣
JIT优势:
能够根据当前硬件状况实时编译生成最优机器指令(ps. AOT也能够作到,在用户使用时使用字节码根据机器状况在作一次编译)
能够根据当前程序的运行状况生成最优的机器指令序列
当程序须要支持动态连接时,只能使用JIT
能够根据进程中内存的实际状况调整代码,使内存可以更充分的利用
JIT缺点:
编译须要占用运行时资源,会致使进程卡顿
因为编译时间须要占用运行时间,对于某些代码的编译优化不能彻底支持,须要在程序流畅和编译时间之间作权衡
在编译准备和识别频繁使用的方法须要占用时间,使得初始编译不能达到最高性能优化
AOT优势:
在程序运行前编译,能够避免在运行时的编译性能消耗和内存消耗
能够在程序运行初期就达到最高性能
能够显著的加快程序的启动
AOT缺点:
在程序运行前编译会使程序安装的时间增长
牺牲Java的一致性
将提早编译的内容保存会占用更多的外spa
与Android的关联
Android在2.2的时候引入JIT,在kitkat时新增了ART(Android RunTime),在Android L时使用ART彻底替代了Dalvik做为默认的虚拟机环境。htm
Dalvik
Dalvik使用JIT,使用.dex字节码,是针对Android设备优化后的DVM所使用的运行时编译字节码。blog
.odex是对dex的优化,deodex在系统第一次开机时会提取全部apk内的dex文件,odex优化将dex提早提取出,加快了开机的速度和程序运行的速度
ART
ART 使用AOT,在安装apk时会进行预编译,生成OAT文件,仍以.odex保存,可是与Dalvik下不一样,这个文件是可执行文件
dex、odex 都可经过dex2oat生成oat文件,以实现兼容性。在大型应用安装时须要更多时间和空间
Android N引入的混合编译。进程
在Android N中引入了一种新的编译模式,同时使用JIT和AOT。这是我在网上找到的一些解释:内存
包含了一个混合模式的运行时。应用在安装时不作编译,而是解释字节码,因此能够快速启动。ART中有一种新的、更快的解释器,经过一种新的JIT完成,资源
可是这种JIT的信息不是持久化的。取而代之的是,代码在执行期间被分析,分析结果保存起来。而后,当设备空转和充电的时候,ART会执行针对“热代码”进行的基于分析的编译,其余代码不作编译。为了获得更优的代码,ART采用了几种技巧包括深度内联。 对同一个应用能够编译数次,或者找到变“热”的代码路径或者对已经编译的代码进行新的优化,
这取决于分析器在随后的执行中的分析数据。
新的ART在安装程序时使用JIT,在JIT编译了一些代码后将这些代码保存到本地,等到设备空闲的时候将保存的这些代码使用AOT编译生成可执行文件保存到本地,待下次运行时直接使用,而且不断监视代码的更新,在代码有更新后从新生成可执行文件。