JIT,即Just-in-time,动态(即时)编译,边运行边编译;
AOT,Ahead Of Time,指运行前编译,是两种程序的编译方式
JIT
JIT,即“Just In Time”,翻译过来就是“即时编译技术”。android在2.2版本引入此技术,主要是用来提高程序的执行效率的。 对于会多次执行到的代码(比如某个类的函数、某一个经常使用到的执行路径相关的代码,就是所谓的“热点函数”、“热点trace”),JIT会将其编译成机器码。下次再执行此代码时就直接执行机器码,从而提高了代码的执行效率。
为什么只是对热点函数、热点trace进行JIT编译,而不是全部的字节码?首先,字节码的大部分代码一般不会总是执行到(即执行频率低),而JIT是在程序运行期间编译,编译时又需要时间,在程序运行期间花时间编译一般不会执行到的代码,这不是一个好的选择。所以,JIT只编译热点函数、热点trace,对于非热点的代码仍旧在用到时用解释器去解释成机器码然后执行就可以了。 JIT编译而来的机器码是存储到内存中的,不是在硬盘上。所以,在应用重新启动时,所有的热点代码也都需要使用jit重新编译成机器码。
网上找到一段关于JIT在代码层面实现逻辑的说明,“每启动一个应用程序,都会相应地启动一个dalvik虚拟机,启动时会建立JIT线程,一直在后台运行。当某段代码被调用时,虚拟机会判断它是否需要编译成机器码,如果需要,就做一个标记,JIT线程不断判断此标记,如果发现被设定就把它编译成机器码,并将其机器码地址及相关信息放入entry table中,下次