定义
JIT,即 Just-in-time,动态(即时)编译,边运行边编译;AOT,Ahead Of Time,指运行前编译,是两种程序的编译方式
区别
这两种编译方式的主要区别在于是否在“运行时”进行编译
优劣
JIT 优点
可以根据当前硬件情况实时编译生成最优机器指令(ps. AOT 也可以做到,在用户使用是使用字节码根据机器情况在做一次编译)
可以根据当前程序的运行情况生成最优的机器指令序列
当程序需要支持动态链接时,只能使用 JIT
可以根据进程中内存的实际情况调整代码,使内存能够更充分的利用
JIT 缺点
编译需要占用运行时资源,会导致进程卡顿
由于编译时间需要占用运行时间,对于某些代码的编译优化不能完全支持,需要在程序流畅和编译时间之间做权衡
在编译准备和识别频繁使用的方法需要占用时间,使得初始编译不能达到最高性能
AOT 优点
在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗
可以在程序运行初期就达到最高性能
可以显著的加快程序的启动
AOT 缺点
在程序运行前编译会使程序安装的时间增加
牺牲 Java 的一致性
将提前编译的内容保存会占用更多的外
与 Android 的关联
Android 在 2.2 的时候引入 JIT,在 kitkat 时新增了 ART(Android RunTime),在 Android L 时使用 ART 完全替代了 Dalvik 作为默认的虚拟机环境。
Dalvik
Dalvik 使用 JIT
使用.dex 字节码,是针对 Android 设备优化后的 DVM 所使用的运行时编译字节码
.odex 是对 dex 的优化,deodex 在系统第一次开机时会提取所有 apk 内的 dex 文件,odex 优化将 dex 提前提取出,加快了开机的速度和程序运行的速度
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 编译生成可执行文件保存到本地,待下次运行时直接使用,并且不断监视代码的更新,在代码有更新后重新生成可执行文件。