1.什么是JVM
JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JVM运行在操作系统上,屏蔽了底层实现的差异,JVM的作用是把平台无关的.class里面的字节码翻译成平台相关的机器码,来实现跨平台。
2.什么是DVM
DVM就是Dalvik Virtual Machine,是安卓中使用的虚拟机,所有安卓程序都运行在安卓系统进程里,每个进程对应着一个Dalvik虚拟机实例。他们都提供了对象生命周期管理、堆栈管理、线程管理、安全和异常管理以及垃圾回收等重要功能,各自拥有一套完整的指令系统。
3.JVM和DVM区别
(1)DVM之所以不是JVM主要原因是DVM并没有遵守JVM规范来实现。
(2)基于架构不同:Dalvik指令集是基于寄存器的架构,执行特有的文件格式——dex字节码(适合内存和处理器速度有限的系统)。而JVM是基于栈的。相对于基于栈的JVM而言,基于寄存器的Dalvik VM实现虽然牺牲了一些平台无关性,但是它在代码的执行效率上要更胜一筹。
(3)执行字节码不同,并且Dalvik可执行文件体积更小,JAVA虚拟机运行的是JAVA字节码,Dalvik虚拟机运行的是Dalvik字节码,Dalvik字节码由JAVA字节码转换而来,并被打包到一个DEX(Dalvik Executable)可执行文件中,.dex文件将所有APK中的.class里边所包含的信息全部整合在一起,DVM通过解释DEX文件来执行这些字节码,class文件中包含多个不同的方法签名,如果A类文件引用B类文件中的方法,方法签名也会被复制到A类文件中,也就是说,多个不同的类会同时包含相同的方法签名,同样地,大量的字符串常量在多个类文件中也被重复使用,这些冗余信息会直接增加文件的体积,而JVM在把描述类的数据从class文件加载到内存时,需要对数据进行校验、转换解析和初始化,最终才形成可以被虚拟机直接使用的JAVA类型,因为大量的冗余信息,会严重影响虚拟机解析文件的效率。SDK中有个dx工具负责将JAVA字节码转换为Dalvik字节码,dx工具对JAVA类文件重新排列,将所有JAVA类文件中的常量池分解,消除其中的冗余信息,重新组合形成一个常量池,所有的类文件共享同一个常量池,使得相同的字符串、常量在DEX文件中只出现一次,从而减小了文件的体积。 两者最大区别就是DVM的消除了更过冗余信息,体积更小,更适合移动设备。
(4)每一个Android 的App是独立跑在一个VM中的。因此一个App crash只会影响到自身的VM,不会影响到其他。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个 Dalvik应用作为一个独立的Linux进程执行。
(5)DVM有共享机制:DVM拥有预加载共享机制,不用应用运行时可以共享相同的类,拥有更高的效率,而JVM机制不存在这种共享机制,不同的程序,打包以后都是彼此独立的,即使使用了相同的类,运行时也是单独加载和运行的,无法进行共享;
(6)DVM运行时堆使用标记清除算法进行GC,这样就会导致内存碎片问题,影响移动设备的性能,JVM可能会采用标记清除、复制、标记整理、分代收集等多种垃圾收集算法进行GC;
4.什么是ART虚拟机
ART虚拟机是Android4.4发布的,用来替换DVM虚拟机,在Android5.0以后的版本默认采用ART虚拟机,DVM从此退出历史舞台。
5.ART虚拟机和DVM区别
(1)在Dalvik下,应用每次运行都需要通过即时编译器(JIT)将字节码转换为机器码,即每次都要编译加运行,这虽然会使安装过程比较快,但是会拖慢应用的运行效率。而在ART 环境中,应用在第一次安装的时候,字节码就会预编译(AOT)成机器码,这样的话,虽然设备和应用的首次启动(安装慢了)会变慢,但是以后每次每次打开应用,执行的都是本地机器码。移除了运行时的解释执行都可以直接运行,因此运行效率会提高。Android7.0版本ART加入了即时编译器JIT,作为AOT的一个补充,在应用程序安装时并不会将字节码全部编译成机器码,在运行中将热点代码编译成机器码,从而缩短应用程序的安装时间并节省存储空间。
(2)DVM是为32位CPU设计,而ART支持64位并兼容32位CPU。
(3)ART占用空间比Dalvik大(原生代码占用的存储空间更大,字节码变为机器码之后,可能会增加10%-20%),这也是著名的“空间换时间大法"。
(4)预编译也可以明显改善电池续航,因为应用程序每次运行时不用重复编译了,从而减少了 CPU 的使用频率,降低了能耗。
(5)DVM运行时堆采用标记清除算法进行GC,这就会导致内存碎片问题影响移动设备性能,内存碎片问题详细内容请参考移动App性能呢评测与优化,ART虚拟机引入MarkSweep+SemiSpace垃圾收集器,会对内存碎片进行整理,这样就不会有内存碎片问题。
参考资料
Android开发——JVM、Dalvik以及ART的区别
JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比
《深入理解Java虚拟机》
《Android进阶解密》