简介

在本文中,我们将探讨Java虚拟机(JVM)Dalvik虚拟机(DVM)之间的区别。我们将首先对它们进行快速浏览,然后进行比较。

什么是运行时

运行时系统提供了一种环境,可将以高级语言(如Java)编写的代码转换为机器代码,并且可由中央处理单元(CPU)理解。

我们可以区分以下类型的翻译器:

  • 汇编程序:他们直接将汇编代码转换为机器代码,因此速度很快
  • 编译器:他们将代码转换为汇编代码,然后使用汇编器将结果代码转换为二进制。使用此技术的速度很慢,但是执行速度很快。而且,生成的机器代码取决于平台
  • 解释器:他们在执行代码时翻译代码。由于翻译是在运行时进行的,因此执行速度可能很慢

Java虚拟机

JVM是运行Java桌面、服务器和Web应用程序的虚拟机。关于Java的另一个重要的事情是它在开发时就考虑到了可移植性。因此,JVM已经成型(shaped)所以也可以支持多种主机架构,并且可以在任何地方运行。 但是,对于嵌入式设备而言,它太重了。

Java具有活跃的社区,并且将来会继续被广泛使用。 此外,HotSpot是JVM参考实现。同样,开源社区还维护着五个以上的其他实现。

随着新的基于cadence-based的发行版,Java和JVM每六个月接收一次新更新。例如,我们可以列出有关下一版本的一些建议,例如外部存储器访问API打包工具

Dalvik虚拟机

DVM是运行Android应用程序的虚拟机。 DVM执行Dalvik字节码,该字节码是用Java语言编写的程序编译而成的。请注意,DVM不是JVM。

DVM的主要设计原则之一是,它应在低内存移动设备上运行,并且与任何JVM相比,加载速度更快。此外,当此VM在同一设备上运行多个实例时,效率更高。

2014年,Google发布了适用于Android 5的Android Runtime(ART),并取代了Dalvik,从而提高了应用程序性能,电池使用率。最后的版本是Android 4.4上的1.6.0。

JVM和DVM之间的区别

架构

JVM是基于堆栈的VM,其中所有的算术和逻辑运算都是通过push和pop操作数执行的,结果存储在堆栈中。堆栈也是存储方法的数据结构。

相反,DVM是基于寄存器的VM。 这些位于CPU中的寄存器执行所有的算术和逻辑运算。寄存器是用于存储操作数的数据结构。

编译

Java代码在JVM内被编译为称为Java字节码(.class文件)的中间格式。然后,JVM解析生成的Java字节码并将其转换为机器代码。

在Android设备上,像JVM一样,DVM将Java代码编译为Java字节码(.class文件)的中间格式。然后,借助称为Dalvik eXchange或dx的工具,它将Java字节码转换为Dalvik字节码。 最后,DVM将Dalvik字节码转换为二进制机器码。

两个VM均使用即时(JIT)编译器。 JIT编译器是一种在运行时执行编译的编译器。

性能

如上所述,JVM是基于堆栈的VM,DVM是基于寄存器的VM。基于堆栈的VM字节码非常紧凑,因为操作数的位置隐式位于操作数堆栈上。基于寄存器的VM字节码要求所有隐式操作数都应成为指令的一部分。这表明基于寄存器的代码大小通常会比基于堆栈的字节码大得多。

另一方面,与相应的基于堆栈的VM相比,基于寄存器的VM可以使用更少的VM指令来表示计算。调度VM指令的成本很高,因此减少执行的VM指令可能会大大提高基于寄存器的VM的速度。

当然,这种区别仅在以解释模式运行VM时才有意义。

在HotSpot里面,代码执行有两种模式:

  • 直接解释指令:这使用的是HotSpot的解释引擎,它采用模板解释,将每一条指令直接翻译成本地代码,而后由硬件直接执行;
  • 编译执行:是指将代码直接翻译成本地代码执行,这就是耳熟能详的JIT编译器,更加准确的说是HotSpot Compiler;

执行

尽管可以为每个正在运行的应用程序设置一个JVM实例,但是通常我们只配置一个具有共享进程和内存空间的单个JVM实例来运行我们已部署的所有应用程序。

但是,Android被设计成运行多个DVM实例。因此,要运行应用程序或服务,Android操作系统会在共享内存空间中创建一个具有单独进程的新DVM实例,并部署代码以运行该应用程序。

结论

在本教程中,我们介绍了JVM和DVM之间的主要区别。两个VM都运行用Java编写的应用程序,但是它们使用不同的技术和过程来编译和运行代码。

What Is the Difference Between DVM and JVM?

虚拟机执行模式