面试关于jvm、dvm和art虚拟机区别

一、Dalvik与JVM的区别

1、首先最主要的区别,Dalvik 基于寄存器,而 JVM 基于栈。那么什么是基于寄存器什么是基于栈呢?

有关寄存器可以参照百度百科的内容,下面是一段摘抄:

寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。在中央处理器的算术及逻辑部件中,寄存器有累加器(ACC)。

寄存器的用途:

1.可将寄存器内的数据执行算术及逻辑运算。

2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。

3.可以用来读写数据到电脑的周边设备。

寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂存器群组。更适当的是称他们为“架构寄存器”。

从上面我们可以大致了解真实硬件设备中寄存器的作用,我们知道虚拟机是真机的一种模拟,所以可以大概理解虚拟机中的寄存器,不过基于寄存器的虚拟机可能跟真机差别比较大 。

基于栈的虚拟机代码必须使用push和pop指令来移动变量,每个指令操作一个地址,比如进行一个加法操作,需要分别取出要相加的变量,计算然后再将结果存入栈中。对于基于寄存器的虚拟机,没有出栈和入栈的操作,只需要执行一条指令就可以了。寄存器虚拟机和栈虚拟机的指令的差别在于,运算大都是二地址或三地址指令。所以。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。

2、JVM运行java字节码,DVM运行的是其专有的文件格式Dex

JVM字节码由.class文件组成,每个文件一个class。JVM在运行的时候为每一个类装载字节码。相反的,Dalvik程序只包含一个.dex文件,这个文件包含了程序中所有的类。Java编译器创建了JVM字节码之后,Dalvik的dx编译器删除.class文件,重新把它们编译成Dalvik字节码,然后把它们写进一个.dex文件中。

以上是jvm和dvm主要的两点区别,其他区别还有:

.每一个DVM对应一个linux程序

.DVM 和 JVM SDK的SDK不同。

二、Dalvik与art虚拟机的区别

Dalvik就是Android4.4及之前使用的虚拟机,它使用的是JIT(Just-In-Time)技术来进行代码转译,每次执行应用的时候,Dalvik将程序的代码编译为机器语言执行。

ART虚拟机是在Android5.0才开始使用的Android虚拟机,ART虚拟机必须要兼容Dalvik虚拟机的特性,但是ART有一个很好的特性AOT(ahead of time),这个特性就是我们在安装APK的时候就将dex直接处理成可直接供ART虚拟机使用的机器码,ART虚拟机将.dex文件转换成可直接运行的.oat文件,ART虚拟机天生支持多dex,所以也不会有一个合包的过程,所以ART虚拟机会很大的提升APP冷启动速度。

虚拟机从Dalvik换成ART后,Android系统的性能得到了一定程度的提升。不过ART与Dalvik相比也存在一些缺点,比较明显的表现就是,apk经过dex2oat预编译之后,占用的空间增加,因此Android ROM占用的空间更大。手机在安装下载的apk时,安装时间也明显变长。

你可能感兴趣的:(安卓)