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。 | 只支持安卓操作系统。 |