DVM 和 JVM 有什么区别?

Java 虚拟机和 Dalvik 虚拟机有什么不同?

64418 次浏览

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

从概念上讲,几乎没有 与应用程序级别不同 between a DVM and a JVM. 建筑学上,有一个主要的 基于寄存器的 DVM and the stack-based JVM.

两者都使用 VM 代码模型 DVM 使用基于寄存器的操作码 类似以注册处为基础的 字节码指令 目标平台已经执行 包括那些 可从 ARM 和 MIPS 和 X86的兼容架构 英特尔,AMD 和威盛科技。

谷歌开发了 Android,并选择了 DVM 有几个原因。首先,有 大多数 JVM 的许可问题, DVM 应该更有效率 terms of memory usage and performance 在一个基于寄存器的机器上。 DVM 是 也应该更有效率 控件的多个实例 应用程序都有自己的版本 instance. Hence, multiple active 应用需要多个 DVM instances. Like most Java 实现时,DVM 具有一个 automatic garbage collector.

还有更多

DVM 是基于寄存器的设计,它运行在低内存,使用自己的字节码和运行。Dex 文件

JVM 是基于 Stack 的,它使用 java 字节码并运行带有 JIT 的.class 文件。

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

基于堆栈的机器必须使用指令来加载堆栈上的数据并操作这些数据,因此,需要比寄存器机器更多的指令来实现相同的高级代码,但寄存器机器中的指令必须编码源和目标寄存器,因此,往往更大。

Jvm 将基于字节码工作,dvm 将基于优化的字节码工作。这是为移动平台优化的,因为移动设备具有低内存和低进程,这就是为什么它使用 linux 内核。

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

The Java virtual machine organizes the memory it requires to execute a program 进入几个运行时数据区域。

Generally, stack-based machines must use instructions to load data on the stack 并操纵数据,因此,需要更多的指令 寄存器机器实现相同的高级代码,但指令 在寄存器机器中必须对源寄存器和目标寄存器进行编码 因此,往往更大。

这种差异主要是重要的 VM 解释器的操作码 调度往往是昂贵的,其他因素与 JIT 编译有关。

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

虚拟机只是减少了使用更少的空间-> > Dalvik 目前没有即时编译器(JIT) ,而是 Android 2.0 包括一个实验源(默认禁用)。 常量池已经修改为仅使用32位索引以简化操作 the interpreter. It uses its own bytecode, not Java bytecode***

下面是一个表格比较(来源: 阿图尔先生) :

enter image description here

Dalvik VM 不能执行 Java 字节码(. class)它必须是(. dex)

Oracle JVM 采用基于堆栈的架构,Dalvik 采用基于注册的架构。

支持多操作系统的 JVM。(它是开源的)但是支持安卓操作系统的 DVM (在安卓5.0之前,安卓使用了 DVM)

enter image description here

Here, We can get the basic difference among the JVM (Java Virtual Machine) and DVM (Dalvik Virtual Machine). 从图中可以明显看出,DVM 只能运行。Dex 文件。Dex 编译器采用所有。类(可以由 JVM 执行)文件,用于所有属于应用程序的类,并将所有类转换为单个。Dex 档案。回见。指针文件由 DVM 执行。另外。类文件(java 编译器)生成的类文件。Java-> .同学们。