DVM和JVM有什么区别?


Answers:


82

DVM基于寄存器,旨在在低内存上运行,使用其自己的字节码并运行.Dex文件

JVM基于堆栈,它使用Java字节代码并运行具有JIT的.class文件。

Java编译器将Java源代码编译为.class文件。然后,Android SDK的dx(dexer)工具会将.class文件处理为称为DEX的文件格式,其中包含Dalvik字节码。dx工具消除了类中存在的所有冗余信息。在DEX中,应用程序的所有类都打包到一个文件中。DVM的设计使设备可以有效地运行VM的多个实例。

基于堆栈的计算机必须使用指令将数据加载到堆栈上并处理该数据,因此,与寄存器机器相比,需要更多的指令来实现相同的高级代码,但是寄存器机器中的指令必须对源寄存器和目标寄存器进行编码因此,往往会更大。


2
我们是否没有可用寄存器的限制?
roottraveller

30

从概念上讲,DVM和JVM之间的应用程序级别差异很小。在体系结构上,基于寄存器的DVM与基于堆栈的JVM之间存在主要差异。

两者都使用VM代码模型。但是,DVM使用的基于寄存器的操作码与大多数目标平台已执行的基于寄存器的字节码指令相当。这包括ARM和MIPS可用的体系结构以及Intel,AMD和VIA Technologies的x86兼容体系结构。

Google开发Android并选择DVM的原因有很多。首先,大多数JVM存在许可问题。接下来,DVM在基于寄存器的计算机上的内存使用和性能方面应该更加高效。当运行DVM的多个实例时,DVM还应该更有效。应用程序有自己的实例。因此,多个活动应用程序需要多个DVM实例。像大多数Java实现一样,DVM具有自动垃圾收集器。

关于它的更多信息


7

jvm体系结构是基于堆栈的,而dvm体系结构是基于寄存器的。对于相同的任务,基于堆栈的机器比基于寄存器的机器需要更多的指令(​​即更大的指令集)。另一方面,基于寄存器的机器中的每个指令都更大。


5

当Java虚拟机开始运行程序时,它需要内存来存储许多东西,包括字节码和从加载的类文件中提取的其他信息,程序实例化的对象,方法的参数,返回值,局部变量以及中间计算结果。

Java虚拟机将执行程序所需的内存组织到几个运行时数据区域中。

通常,基于堆栈的计算机必须使用指令将数据加载到堆栈上并操作该数据,因此,与寄存器机器相比,需要更多的指令来实现相同的高级代码,但是寄存器机器中的指令必须对源代码和源代码进行编码。目标寄存器,因此往往更大。

对于VM解释器来说,这种差异主要很重要,因为VM解释器的操作码调度往往很昂贵,而其他因素与JIT编译相关。

Dalvik针对低内存需求进行了优化,具有一些使其与其他标准VM区别开来的特殊特性。

VM刚刚精简以减少空间使用--- >> Dalvik当前没有即时编译器(JIT),但是Android 2.0包含一个实验性源(默认情况下禁用)。常量池已被修改为仅使用32位索引来简化解释程序。它使用自己的字节码,而不是Java字节码* * *


2
从Android 2.2开始使用JIT,从Android 5.0开始(使用ART替换DVM)使用AOT,然后从Android 7.0开始使用AOT和JIT。
Jemshit Iskenderov

3

Dalvik VM无法执行Java字节码(.class)必须是(.dex)

Oracle JVM具有基于堆栈的体系结构,而Dalvik具有基于寄存器的体系结构。

JVM支持多种操作系统。(它是开源的),但Android操作系统支持DVM(在使用android 5.o之前,android使用了DVM)



0

Jvm将基于字节码工作,而dvm将基于针对移动平台而优化的优化字节码工作,因为移动设备的内存和进程都很低,这就是它使用linux内核的原因。


0

在此处输入图片说明

在这里,我们可以获得JVM(Java虚拟机)和DVM(Dalvik虚拟机)之间的基本区别。从图中可以看出,DVM只能运行.dex文件。Dex编译器接受所有属于应用程序的类的所有.class(可以由JVM执行)文件,并将它们全部转换为单个.dex文件。以后的.dex文件由DVM执行。另外,.class文件由Javac(java编译器)从.java->。class生成。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.