1.JVM与Dalvik
Android应用程序运行在Dalvik/ART虚拟机,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。Dalvik虚拟机实则也算是一个Java虚拟机,只不过它执行的不是class文件,而是dex文件。Dalvik虚拟机的指令集是基于寄存器的,Java虚拟机的指令集是基于堆栈的。两者都是解释执行。
基于栈的虚拟机
栈是内存中的一块连续的存储空间,访问速度比寄存器要慢,每一个运行时的线程,都有一个独立的栈。栈中记录了方法调用的历史,每有一次方法调用,栈中便会多一个栈桢。最顶部的栈桢称作当前栈桢,其代表着当前执行的方法。基于栈的虚拟机通过操作数栈进行所有操作。
基于寄存器的虚拟机
寄存器是CPU内部的一块内存空间,存取速度比栈快的多,寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。
基于寄存器的虚拟机中没有操作数栈,但是有很多虚拟寄存器。其实和操作数栈相同,这些寄存器也存放在运行时栈中,本质上就是一个数组。与JVM相似,在Dalvik VM中每个线程都有自己的PC和调用栈,方法调用的活动记录以帧为单位保存在调用栈上。
2.ART与Dalvik?
Dalvik虚拟机执行的是dex字节码,解释执行。从Android 2.2版本开始,支持JIT即时编译(Just In Time) 在程序运行的过程中进行选择热点代码(经常执行的代码)进行编译或者优化。
而ART(Android Runtime) 是在 Android 4.4 中引入的,也是 Android 5.0 及更高版本的默认虚拟机。?Android 运行时,ART虚拟机执行的是本地机器码。Android的运行时从Dalvik虚拟机替换成ART虚拟机,并不要求开发者将自己的应用直接编译成目标机器码,APK仍然是一个包含dex字节码的文件。
ART 引入了预先编译机制(Ahead Of Time),在安装时,ART 使用设备自带的 dex2oat 工具来编译应用,dex中的字节码将被编译成本地机器码。?
3.Android N 编译方式
ART 使用预先 (AOT) 编译,并且从 Android N混合使用AOT编译,解释和JIT。
1、最初安装应用时不进行任何 AOT 编译(安装又快了),运行过程中解释执行,对经常执行的方法进行JIT,经过 JIT 编译的方法将会记录到Profile配置文件中。
2、当设备闲置和充电时,编译守护进程会运行,根据Profile文件对常用代码进行 AOT 编译。待下次运行时直接使用。
总结
Android5.0 以前使用Dalvik虚拟机,基于寄存器,运行的是dex文件需要通过解释器执行。
Android4.4 引入ART虚拟机,并在5.0取代了Dalvik,使用AOT技术在安装时将dex字节码编译成本地机器码,ART虚拟机直接执行本地机器码,去除了运行时的解释执行,效率更高。
|