DVM和JVM有什么区别

2025/04/02

1. 概述

在本文中,我们将探讨Java虚拟机(JVM)Dalvik虚拟机(DVM)之间的差异。我们将首先快速了解它们,然后进行比较。

请注意,从Android 5.0开始,Dalvik虚拟机已被Android Runtime(ART)取代。

2. 什么是运行时?

运行时系统提供了一个环境,可以将用Java等高级语言编写的代码翻译成中央处理器(CPU)可以理解的机器代码

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

  • 汇编程序:它们直接将汇编代码翻译成机器代码,因此速度很快
  • 编译器:将代码翻译成汇编代码,然后使用汇编器将生成的代码翻译成二进制代码。使用这种技术很慢,但执行速度很快。此外,生成的机器代码依赖于平台
  • 解释器:它们在执行代码时翻译代码,由于翻译发生在运行时,执行速度可能会很慢

3. Java虚拟机

JVM是运行Java桌面、服务器和Web应用程序的虚拟机。关于Java的另一个重要的事情是它是在考虑可移植性的情况下开发的,因此,JVM也被设计为支持多主机架构并随处运行。但是,它对于嵌入式设备来说太重了。

Java有一个活跃的社区,未来会继续被广泛使用。此外,HotSpot是JVM参考实现。此外,开源社区还维护了5个以上的其他实现。

随着新版本的发布,Java和JVM每6个月接收一次新更新。例如,我们可以为下一个版本列出一些建议,例如Foreign-Memory AccessPackaging Tool

4. 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。

5. JVM和DVM的区别

5.1 架构

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

相比之下,DVM是一个基于寄存器的VM。这些位于CPU中的寄存器执行所有算术和逻辑运算,寄存器是存放操作数的数据结构。

5.2 编译

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

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

两个虚拟机都使用即时(JIT)编译器,JIT编译器是一种在运行时执行编译的编译器。

5.3 性能

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

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

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

5.4 执行

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

然而,Android被设计为运行多个DVM实例。因此,为了运行应用程序或服务,Android操作系统在共享内存空间中创建一个具有独立进程的新DVM实例,并部署代码来运行应用程序

6. 总结

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

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章