自从学习Java和Android开始,就会陆续的听到JVM、DVM、ART这些名词,然而它们到底是些什么呢,有什么相同又有什么区别呢?下面就来深入了解一下。
JVM
JVM全称是Java Virtual Machine,意为Java虚拟机。其本质是一个能够运行以Java语言编写程序的软件。
Java在编译后会生成类似于汇编语言的Java字节码。但与C语言编译后产生的汇编语言不同的是,汇编语言会直接在硬件上跑,但Java字节码是在JVM上跑。需要由JVM把字节码翻译成机器指令,才能使Java程序跑起来。
JVM远行在操作系统上,屏蔽了底层实现的差异。JRE(Java Runtime Environment,包括JVM、Java核心类库和支持文件)编译时针对每个平台,因此下载JRE时是分平台的。JVM把平台无关的.class里面的字节码翻译成平台相关的机器码。从而实现了Java的跨平台。
DVM
DVM全称是Dalvik Virtual Machine(Dalvik是作者的祖先曾经居住过的小渔村名字,位于冰岛),是Android中使用的虚拟机。
所有Android程序都运行在Android系统进程里,每一个进程都对应一个Dalvik虚拟机实例。这样,独立的进程可以防止在虚拟机崩溃时所有程序都被关闭。以下列出DVM和JVM的区别。
- 运行的字节码不同
Java程序经过编译,生成Java字节码保存在class文件中,JVM通过解码class文件中的内容来运行程序。
而DVM运行的是Dalvik字节码。所有的Dalvik字节码是由dx工具,将Java字节码转换而来,并被打包到dex(Dalvik Executable)可执行文件中,DVM通过解释dex文件来执行Dalvik字节码。
- 可执行文件体积不同
dx工具会对Java类程序重新排列,把多个类包含在一个dex文件之中。各个类中重复的字符串和其他常数在dex中只存放一次,以节省空间。所以,Dalvik可执行文件体积更小。
- JVM基于栈,DVM基于寄存器
JVM基于栈结构,程序在运行时虚拟机需要频繁地从栈上读写数据,这个过程需要更多的指令分派和内存访问次数,会耗费很多CPU时间。
DVM基于寄存器,数据的访问通过寄存器直接传递,要快很多。
两种架构各有优劣。一般而言,基于堆栈的机器需要更多指令,基于寄存器的机器指令更长。
ART
ART全称是Android Runtime,在2013年作为Android4.4系统中的一项测试功能正式对外发布,在5.0及后续版本中作为正式的运行时库取代了以往的DVM。
ART与DVM主要不同在于:DVM采用的是JIT技术,而ART采用的是AOT技术。同时ART也改善了性能、垃圾回收、应用程序排错以及性能分析。
JIT全称是Just In Time,意为即时编译技术。AOT全称是Ahead Of Time,意为预编译技术。它们是两种不同的编译模式。
DVM执行的是dex字节码,依靠JIT编译器去解释执行,运行时动态的将执行效率很高的dex字节码翻译成本地机器码,然后再执行。而ART直接执行的是本地机器码,在应用程序安装过程中,ART就已经将所有字节码重新编译成了机器码。
DVM的解码过程发生在应用程序的运行过程中,并且应用程序每次重新运行,都要重复这个解码过程。而ART在应用程序运行过程中无需进行实时的编译工作,只需进行直接调用。因此,即使采用了JIT,DVM的总体性能还是不能与ART相比。
总的来说,ART的优点在于:提高了应用程序的运行效率,减少了手机的电量消耗,提高了移动设备的续航能力,在垃圾回收等机制上也有了较大的提升。而它的缺点在于:ART模式下Android应用程序的安装需要消耗更多的时间,同时也会占用更大的储存空间(大约增加10%~20%)。