两种虚拟机的比较—Dalvik VM和JVM
Dalvik虚拟机是Google公司自主设计的运行于Android平台的Java虚拟机。JVM是归Oracle公司所有的,运行在基于PC机上的Window 和Linux操作系上的java虚拟机。Google工程师之所以设计Dalvik虚拟机主要有以下两点原因:若要使用JVM需要获得授权许可,这意味着需要缴纳大量的费用;JVM主要是针对于CPU快,内存大的传统PC机,不适合移动设备。
1. 对比两种虚拟机
Dalvik和JVM两种不同的虚拟机比较如下图1-1所示:
图1-1两种虚拟机的比较
通过对比上图我们可以得出如下几点区别:
(1)Java虚拟机运行java字节码,Dalvik虚拟机运行其专有的文件格式.dex。
(2)为了进一步提高运行速度,Dalivk虚拟机可以运行八进制的文件.Odex。
(3)Dalvik基于寄存器,而JVM基于栈。基于寄存器的虚拟机对于编译之后变大的程序来说,在它们执行时候,花费的时间更短。
2. 对比两种虚拟机编译的文件
下图是两种不同虚拟机编译文件格式的对比,左图是JAVA虚拟机常用的.Class文件,右图是Dalvik虚拟机运行的.dex文件。下面展示的是.class文件转换为.dex文件的过程图,如图1-2所示。
图1-2.class文件转换成.dex
JVM的可执行文件是.class格式,每一个.java文件经过编译之后都要生成ClassFile文件。ClassFile文件是由一个8位的字节流组成的,每一个ClassFile都有固定的格式。从左图可以看出一个.class文件包含的字段:
l Header:头文件用来记录当前自解码的版本以及文件的格式。
l Contant Pool:常量池,存储常量。例如:Public static final String str =”itcast”便会存放在常量池中。
l Class:自解码真正的内容,包含filed,Method,Attributes。
传统的JVM在执行代码时会有多个相同结构的ClassFile文件,Google工程师在编写Dalvik虚拟机时将这些格式相同的ClassFile文件合并成.dex文件,在合并这些文件的同时对.class文件中都出现的常量进行提取并放在常量池(String Constant Pool)中,类常量,字段常量,方法常量也以此类推。这种做法使移动平台能够更快的解析各个文件,提高效率。.odex文件格式是对.dex格式文件的进一步优化。