DVM和JVM有什么区别?

ani*_*ish 72 java android jvm dvm

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

小智 80

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

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

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

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

  • 难道我们没有有限的可用寄存器吗? (2认同)

Dix*_*onD 29

从概念上讲,与DVM和JVM之间的应用程序级别几乎没有区别.在架构上,基于寄存器的DVM和基于堆栈的JVM之间存在重大差异.

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

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

更多关于它


sky*_*sky 7

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


She*_*eel 5

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

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

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

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

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

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

  • 从 Android 2.2 开始使用 JIT,从 Android 5.0(用 ART 取代 DVM)开始使用 AOT,然后从 Android 7.0 开始使用 AOT 和 JIT。 (2认同)