DVM和JVM有什么区别?

Java虚拟机和Dalvik虚拟机有什么区别?

DVM是基于寄存器的,它被devise为在低内存上运行,使用自己的字节码并运行.Dex文件

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

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

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

从概念上讲,DVM和JVM之间的应用程序级别没什么区别。 在架构上,基于寄存器的DVM和基于堆栈的JVM之间有一个主要区别。

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

Google开发Android并selectDVM有几个原因。 首先,大多数JVM都存在许可问题。 接下来,就基于寄存器的机器上的内存使用和性能而言,DVM应该更高效。 运行多个DVM实例时,DVM也应该更有效率。 应用程序被赋予自己的实例。 因此,多个活动应用程序需要多个DVM实例。 像大多数Java实现一样,DVM具有自动垃圾收集器。

更多关于它

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

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

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

一般来说,基于堆栈的机器必须使用指令来加载堆栈上的数据并处理这些数据,因此需要比注册机器更多的指令来实现相同的高级代码,但注册机器中的指令必须对源代码进行编码目的地寄存器,因此往往更大。

这种差异对于操作码调度往往比较昂贵的VM翻译者来说是非常重要的,而其他因素与JIT编译相关。

针对低内存需求进行了优化,Dalvik具有一些与其他标准虚拟机相区别的特性>>>>>

虚拟机只是减less使用空间— >> Dalvik目前没有即时编译器(JIT),但Android 2.0包括一个实验源(默认禁用)。 常量池已被修改为仅使用32位索引来简化解释器。 它使用自己的字节码,而不是Java字节码* * *

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