JVM和DVM的区别

JVM(Java虚拟机)

JVM是在不同平台上运行java代码的虚拟机。它作为程序和运行java代码的平台之间的一个抽象层。因为有了JVM,Java代码的可移植性才成为可能。javac编译器将源代码文件(.java文件)转换为独立于机器/平台的中间java字节码格式。这个中间文件然后被提供给目标机器/平台,在那里它被翻译成机器代码。JVM支持多种主机架构,这就是为什么Java应用程序被称为WORA(Write Once Run Anywhere)的原因。

DVM(Dalvik虚拟机)

DVM是一个执行Android应用程序的虚拟机。由javac编译器生成的Java字节码(.class文件)被转换为Dalvik字节码,使应用程序的源文件可以在DVM上执行。由于安卓设备有一定的处理能力、内存和电池寿命,DVM的设计原则旨在优化自身,使其即使在低内存/低功率的设备上也能快速加载并顺利运行。这个虚拟机在同一设备上运行多个实例时非常高效。

注:谷歌在2014年为安卓应用引入了一个新的虚拟机,被称为安卓运行时(ART)。它的设计目的是提高应用程序的性能,减少设备的电池使用。DVM最后支持的版本是Android 4.4(Kitkat)。

JVM(Java虚拟机) DVM(Dalvik虚拟机)
基于堆栈的虚拟机,通过推送和弹出操作数进行算术和逻辑运算。操作的结果存储在堆栈内存中。 基于寄存器的虚拟机,使用位于CPU中的寄存器来执行算术和逻辑操作。
Java源代码被编译成Java字节码格式(.class文件),进一步翻译成机器代码。 源代码文件首先被编译成JVM那样的Java字节码格式。此外,DEX编译器(dx工具)将Java字节码转换为Dalvik字节码(classes.dex)文件,将用于创建.apk文件。
在堆栈数据结构中的数据加载和操作以及方法加载,需要向虚拟机提供更多信息。 指令大小较大,因为它需要对虚拟机的源和目标寄存器进行编码。
编译的字节码大小是紧凑的,因为操作数的位置隐含在操作数栈中。 编译的字节码大小较大,因为每条指令都需要所有隐式操作数。
设备的可执行文件是.jar文件。 设备的可执行文件是.apk文件。
一个单一的JVM实例被配置为共享进程和内存空间,以运行所有部署的应用程序。 该设备运行多个DVM实例,在共享内存空间中有一个单独的进程,以部署每个应用程序的代码。
支持多种操作系统,如Linux、Windows和Mac OS。 只支持安卓操作系统。