Dalvik和ART虚拟机

简单谈下Dalvik和ART虚拟机的由来和特点

1.cup架构
现在普遍的cup可以分为“复杂指令集”和“精简指令集”两种架构,代表为x86(复杂)和ARM(精简),x86占领了大部分PC端,而ARM由于更低的功耗占领了大部分移动端。

2.Dalvik虚拟机
Android是由Java语言开发,也能使用绝大部分的Java API,为啥不直接使用JVM虚拟机呢?因为Android选择了ARM的cup架构,而JVM是基于栈的虚拟机,性能和功耗是几乎所有手机的最先考虑的,ARM的cup包含更多的寄存器,寄存器速度比内存更快,因此google公司研发了基于寄存器的虚拟机Dalvik,这样可以进一步优化手机的性能。

3.ART虚拟机
Dalvik虚拟机使用JIT(just in time)方式进行编译。
什么是JIT编译呢?
不使用的JIT编译的虚拟机,在程序运行的过程中:
JVM的翻译器会把class字节码直接翻译成机器码,然后运行。
即:翻译—>机器码—>执行
使用JIT编译:
JVM会收集程序中频繁运行的代码,俗称"热点代码"(HotSpot),然后把这些收集的代码编译成机器码,缓存至内存和本地,下次再次运行这些代码的时候,可以直接使用这些机器码,这样比再次"翻译"要快很多。
即: 收集—>编译—>缓存—>运行
由于实时编译的效率要比实时翻译低,但是编译后的“热点代码”运行效率又比直接翻译要快很多,所以JIT的特点是“先慢后快”。
为了再次优化这个问题,Android5.0之后,google全面使用了ATR虚拟机,ART运用AOT(Ahead Of Time)编译方式:
每个apk在安装的时候,把源码全部编译成机器码存在本地,这样app在运行的时候,直接执行机器码,这样比JIT要快很多。但是ART的缺点也很明显,安装慢且很占空间。
Android7.0之后,ART虚拟机修改为JIT+AOT相结合的方式进行编译程序,刚开始使用APP的时候,直接使用翻译器将dex字节码翻译成机器码运行,同时收集”热点代码”,在手机空闲时间或者充电时间处理这些“热点代码”,并编译为机器码,供下次app运行时直接使用。