JVM 和 Dalvik 虚拟机

Java 虚拟机

  1. Java 虚拟机运行的是 Java字节码
  2. Java 虚拟机基于。 基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多。

Dalvik 虚拟机

Dalvik 是 Google 公司自己设计用于Android平台的虚拟机,在 Android 4.4 及其以上平台使用。

它可以支持已转换为 dex 格式 的 Java 应用程序的运行。dex 格式是专为 Dalvik 设计的一种压缩格式,适合内存和处理器速度有限的系统。
Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个 Dalvik 应用作为一个独立的 Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

在 Dalvik 下,应用每次运行的时候,字节码都需要通过即时编译器(just in time ,JIT)转换为机器码,这会拖慢应用的运行效率。
自 Android 2.2 开始,Dalvik 支持 JIT(just-in-time,即时编译技术)。

优点:

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

缺点:

  1. 机器码占用更大的存储空间。字节码变为机器码之后,可能会增加 10%-20%
  2. 应用的安装速度慢,安装时间更长。

Dalvik 和 JVM 虚拟机的区别

  1. JVM 是基于栈的;Dalvik 是基于寄存器的。
  2. JVM 运行 java 字节码文件;Dalvik 运行 dex 文件。

一般来说,基于堆栈的机器必须使用指令才能从堆栈上的加载和操作数据。因此,相对基于寄存器的机器,它们需要更多的指令才能实现相同的性能。但是基于寄存器机器上的指令必须经过编码,因此,它们的指令往往更大。

Dalvik 虚拟机既不支持 Java SE 也不支持 Java ME 类库(如:Java 类,AWT 和 Swing 都不支持)。 相反,它使用自己建立的类库(Apache Harmony Java 的一个子集)。

ART

ART(Android Runtime) 是 Android 上的应用和部分系统服务使用的托管式运行时。 Android 5.0 及以上平台使用的虚拟机技术。

与 Dalvik 虚拟机使用的 JIT 不同,ART 引入了 AOT 这种预编译技术,在应用程序安装的过程中,ART 使用设备自带的 dex2oat 命令将所有的字节码重新编译成了机器码。

AOT(Ahead-Of-Time)即预编译,应用在第一次安装的时候,把字节码预先编译成机器码。

参考

[1] Android_Runtime - wiki
[2] Dalvik 虚拟机和 ART 虚拟机 - 罗升阳