Android 虚拟机Art和Dalvik的区别

3,018 阅读3分钟

什么是Dalvik?

  1. Dalvik是用于Android平台的Java虚拟机
  2. Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一
  3. 它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行
  4. dex格式是专为Dalvik应用设计的一种压缩格式,适合内存和处理器速度有限的系统
  5. Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为独立的Linux进程执行
  6. 独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭

Dalvik特点

  1. Dalvik是依靠一个Just-In-Time(JIT编译)编译器去解释字节码
  2. Dalvik虚拟机下运行Java时,要将字节码通过即时编译器(just in time ,JIT)转换为机器码(机器码才是能真正运行的),这会拖慢应用的运行效率
  3. 应用安装时,执行dexopt指令,将dex文件优化为odex文件
  4. 应用运行时,会将二进制翻译成机器码流程

鉴于Dalvik这个缺点,Google开发了新的虚拟机叫ART(Android Runtime)

ART(ART代表Android Runtime,Android 4.4引入)

  1. 应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用,这个过程叫做预编译(AOT,Ahead-Of-Time)
  2. 在移除解释代码这一过程后,应用程序执行将更有效率,启动更快

ART特点

  1. AOT编译
  2. 应用安装时执行dex2oat指令,将dex文件翻译为oat文件
  3. 应用运行时,无二进制翻译为机器码流程

ART分为2种模式, 即解释模式和AOT机器码模式

  1. 解释模式类似于JavaScript, 就是取出Dex代码并逐条解释,运行仍然会慢
  2. 机器码模式就是在安装app时就编译好Dex对应的机器码,运行很快, 这是Android5.0及后续版本的默认方式。

ART和Dalvik区别

从Android5.0开始废弃了Dalvik,全面推行ART。

  • (1)在Dalvik下,应用每次运行都需要通过即时编译器(JIT)将字节码转换为机器码,即每次都要编译加运行,这虽然会使安装过程比较快,但是会拖慢应用以后每次启动的效率。 而在ART 环境中,应用在第一次安装的时候,字节码就会预编译(AOT)成机器码,这样的话,虽然设备和应用的首次启动(安装慢了)会变慢,但是以后每次启动执行的时候,都可以直接运行,因此运行效率会提高。
  • (2)ART占用空间比Dalvik大(字节码变为机器码之后,可能会增加10%-20%),这也是著名的“空间换时间大法"。
  • (3)预编译也可以明显改善电池续航,因为应用程序每次运行时不用重复编译了,从而减少了 CPU 的使用频率,降低了能耗

ART优点:

  1. 系统性能的显著提升
  2. 应用启动更快、运行更快、体验更流畅、触感反馈更及时
  3. 更长的电池续航能力
  4. 支持更低的硬件

ART缺点:

  1. 更大的存储空间占用,可能会增加10%-20%
  2. 更长的应用安装时间