面试问题之:Dalvik VM和JVM的区别(1)

来源:互联网 发布:2017东南大学软件学院 编辑:程序博客网 时间:2024/04/30 14:04

JVM(Java虚拟机)是一个虚构出来的运行Java程序的运行时,是通过在实际的计算机上仿真模拟各种计算机功能的实现。它具有完善的硬件架构(如处理器、堆栈、寄存器等),还具有相应的指令系统,使用JVM就是使Java程序支持与操作系统无关。理论上在任何操作系统中,只要有对应的JVM,即可运行Java程序。

Dalvik VM是在Android系统上运行Android程序的虚拟机,其指令集是基于寄存器架构的,执行特有的文件格式-dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。

由于Android应用程序的开发编程语言是Java,而Java程序运行在JVM(Java虚拟机)上的,因此有些人会把Android的虚拟机DalvikVM和JVM弄混淆,但是实际上Dalvik并未遵守JVM规范,而且两者也是互不兼容。

从Dalvik VM和JVM的编译过程分析,它们的编译过程如下:

JVM:.java→.class→.jar

Dalvik VM:.java→.class→.dex

从它们的编译过程可以看出,JVM运行的是.class文件的Java字节码,但是Dalvik VM运行的是其转换后的dex(Dalvik Executable)文件。JVM字节从.class文件或者JAR包中加载字节码然后运行,而Dalvik VM无法直接从.class文件或JAR包中加载字节码,它需要通过DX工具将应用程序所有的.class文件编译成一个.dex文件,Dalvik VM则运行这个.dex文件。

下图显示了Dalvik VM与JVM编译过程的区别:

这里写图片描述

从图中可以看出,Dalvik VM把.java文件编译成.class后,会对.class进行重构,整合的基本元素(常量池、类定义、数据段),最后压缩写进一个.dex文件中。其中,常量池描述了所有的常量,包括引用、方法名、数值常量等;类定义包括访问标识、类名等基本信息;数据段中包含各种被VM指定的方法代码以及类和方法的相关信息和实例变量。这种把多个.class文件进行整合的方法,大大提高了Android程序的运行速度,例如:应用程序中多个类定义了字符串常量TAG,而在JVM中,会编译成多个.class文件,每个.class文件的常量池中,均包含这个TAG常量,但是Dalvik VM在编译成.dex文件之后,其常量池里只有一个TAG常量。

JVM和Dalvik VM还有一点非常重要的不同,就是基于的架构不同。JVM是基于栈的架构,而Dalvik VM是基于寄存器的架构。相对于基于栈的JVM而言,基于寄存器的Dalvik VM实现虽然牺牲了一些硬件上的通用性,但是它在代码的执行效率上要更胜一筹。一般来讲,VM中指令的解释执行的时间主要花费在以下三个方面:

分发指令;

访问运算数;

执行运算;

其中分发指令这个环节对性能的影响最大。在基于寄存器的Dalvik VM中,可以更有效的减少冗余指令的分发,减少内存的读写访问。

从JVM和Dalvik VM的区别上来说,Dalvik VM主要是针对Android这个嵌入式操作系统的特点进行了各种优化,使其更省电、更省内存、运行效率更高,但是牺牲了一些JVM的与平台无关的特性。实际上,Dalvik VM本就是为Android设计的,无需考虑其它平台的问题。这里只是介绍了JVM和Dalvik VM的两个重要的区别,毕竟本书并不是讲解Android内核的,这里只是点明Dalvik VM的特点,读者对这部分的内容了解即可。

文章转自http://book.51cto.com/art/201404/437195.htm

0 0