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