JVM / Dalvik / ART

JVM / Dalvik / ART知识点记录


JVM / Dalvik

Android应用程序运行在Dalvik/ART虚拟机,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。Dalvik虚拟机实则也算是一个Java虚拟机,只不过它执行的不是class文件,而是dex文件。

Jvm基于栈,Dalvik基于寄存器,可以结合【第01讲:程序运行时,内存到底是如何进行分配的?】一文来理解,与JVM版相比,Dalvik版程序的指令数明显减少,数据移动次数也明显减少


Dalvik / ART

Dalvik虚拟机执行的是dex字节码,解释执行。从Android 2.2版本开始,支持JIT及时编译(Just In Time)在程序运行的过程中进行选择热点代码(经常执行的代码)进行编译或者优化。 

ART(Android Runtime) 是在 Android 4.4 中引入的一个开发者选项,也是 Android 5.0 及更高版本的默认 Android 运行时。ART虚拟机执行的是本地机器码。ART 引入了预先编译机制(Ahead Of Time,即AOT),在安装时,ART 使用设备自带的 dex2oat 工具来编译应用,dex中的字节码将被编译成本地机器码。


dexopt和dex2oat区别

dexopt结果:odex文件,只是优化了操作,在运行时操作(启动慢)
dex2oat结果:ELF文件,即机器码,安装时对dex提前编译(安装慢)


Android N

从 Android N混合使用AOT编译+解释+JIT

1、最初安装应用时不进行任何 AOT 编译(安装又快了),运行过程中解释执行,对经常执行的方法进行JIT,经过 JIT 编译的方法将会记录到Profile配置文件中。

2、当设备闲置和充电时,编译守护进程会运行,根据Profile文件对常用代码进行 AOT 编译。待下次运行时直接使用。