Java虚拟机和Dalvik虚拟机有什么区别?
8 回答
DVM 基于寄存器,旨在在低内存上运行,使用自己的字节码并运行 .Dex 文件
JVM 是基于堆栈的,它使用 java 字节码并运行具有 JIT 的 .class 文件。
Java 源代码由 Java 编译器编译成 .class 文件。然后 dx (dexer) 工具,Android SDK 的一部分,将 .class 文件处理成包含 Dalvik 字节码的称为 DEX 的文件格式。dx 工具消除了类中存在的所有冗余信息。在 DEX 中,应用程序的所有类都打包到一个文件中。DVM 的设计使设备可以高效地运行 VM 的多个实例。
基于堆栈的机器必须使用指令将数据加载到堆栈上并操作该数据,因此需要比寄存器机器更多的指令来实现相同的高级代码,但寄存器机器中的指令必须对源寄存器和目标寄存器进行编码因此,往往更大。
从概念上讲,DVM 和 JVM 之间的应用程序级别几乎没有区别。在架构上,基于寄存器的 DVM 和基于堆栈的 JVM 之间存在重大差异。
两者都使用 VM 代码模型。但是,DVM 使用的基于寄存器的操作码与大多数目标平台已经执行的基于寄存器的字节码指令相当。这包括来自 ARM 和 MIPS 的架构以及来自 Intel、AMD 和 VIA Technologies 的 x86 兼容架构。
Google 开发 Android 并选择 DVM 有几个原因。首先,大多数 JVM 都存在许可问题。接下来,DVM 在基于寄存器的机器上的内存使用和性能方面应该更有效。在运行多个 DVM 实例时,DVM 也应该更高效。应用程序有自己的实例。因此,多个活动应用程序需要多个 DVM 实例。像大多数 Java 实现一样,DVM 有一个自动垃圾收集器。
jvm 架构是基于堆栈的,而 dvm 架构是基于寄存器的。对于相同的任务,基于堆栈的机器比基于寄存器的机器需要更多的指令(即更大的指令集)。另一方面,基于寄存器的机器中的每条指令都更大。
当 Java 虚拟机开始运行程序时,它需要内存来存储许多东西,包括从加载的类文件中提取的字节码和其他信息、程序实例化的对象、方法的参数、返回值、局部变量和计算的中间结果.
Java 虚拟机将执行程序所需的内存组织成几个运行时数据区域。
通常,基于堆栈的机器必须使用指令将数据加载到堆栈上并操作该数据,因此需要比寄存器机器更多的指令来实现相同的高级代码,但寄存器机器中的指令必须对源代码和目标寄存器,因此往往更大。
这种差异主要对 VM 解释器很重要,对他们来说操作码分派往往很昂贵,并且其他因素与 JIT 编译相关。
Dalvik 针对低内存要求进行了优化,具有一些使其与其他标准 VM 不同的特定特征>>>>>
虚拟机被精简以使用更少的空间--->> Dalvik 目前没有即时编译器 (JIT),但 Android 2.0 包含一个实验源(默认禁用)。常量池已修改为仅使用 32 位索引以简化解释器。它使用自己的字节码,而不是 Java 字节码* * *
Dalvik VM 不能执行 Java 字节码(.class)它必须是(.dex)
Oracle JVM 具有基于堆栈的架构,而 Dalvik 具有基于寄存器的架构。
JVM 支持多个操作系统。(它是开源的)但 Android 操作系统支持 DVM(在 comming android 5.o android 使用 DVM 之前)
这是一个表格比较(来源:Atul 先生):
Jvm 将基于字节码工作,dvm 将基于优化的字节码工作,它针对移动平台进行了优化,因为移动设备的内存和进程低,这就是它使用 linux 内核的原因。