——个人平时笔记,看到的同学欢迎指正错误,文中多处摘录于各大博主与书籍精华
1、什么是JVM?
JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的.class字节码文件,与C语言编译后产生的汇编语言不同的是,C编译成的汇编语言会直接在硬件上跑,但JAVA编译后生成的.class字节码是在JVM上跑,需要由JVM把字节码翻译成机器指令,才能使JAVA程序跑起来。
JVM运行在操作系统上,屏蔽了底层实现的差异,从而有了JAVA吹嘘的平台独立性和Write Once Run Anywhere。根据JVM规范实现的具体虚拟机有几十种,主流的JVM包括Hotspot、Jikes RVM等,都是用C/C++和汇编编写的,每个JRE编译的时候针对每个平台编译,因此下载JRE(JVM、Java核心类库和支持文件)的时候是分平台的,JVM的作用是把平台无关的.class里面的字节码翻译成平台相关的机器码,来实现跨平台。
2、什么是DVM?
Android 运行环境主要指的Dalvik虚拟机技术,也就是安卓虚拟机DVM。Android中的所有Java程序都是运行在DVM上的,每个Android应用进程对应着一个独立的Dalvik虚拟机实例并在其解释下执行。DVM没有遵循Java虚拟机规范,不能直接执行Java的.class文件,而是执行.dex文件。它使用的是寄存器架构而不是JVM中常见的栈架构。其中.dex(Dalvik Executable)文件是通过.class文件转化而来,安卓使用Java语法编写应用程序,可以直接使用大部分的Java API等。
虽然DVM也是用Java编程语言,Dalvik虚拟机和一般JAVA虚拟机(Java VM)并不兼容,他们两个的区别是JVM标准执行的是.class的字节码(bytecode ),而是DVM执行的是其专有的(.dex)执行文件。在编译过程中,Java把类编译成一个或多个.class字节码文件,然后打包到jar中。JVM会从jar文件中获得相应的.class文件和jre字节码。DVM虽然也是用Java语言进行编程, 但是Java程序通过编译后,还需要通过SDK中的dex工具将.class文件转化打包成.dex格式文件,DVM才能从其中读取指令和数据。
JVM与DVM 二者最大的区别在于JVM是基于栈的虚拟机(Stack-based),而DVM是基于寄存器的虚拟机(Register-based)。基于寄存器的虚拟机虽然比基于堆栈的虚拟机在硬件通用性上要差一些,但是它的代码执行效率却更好。 显然DVM最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。移动终端与PC相比,它不需要很快的CPU和大量的内存空间。Google的测算显示,64MB的内存已经能让系统正常运转了。 其中24MB被用于底层系统的初始化和启动,另外20MB被用于启动高层服务。
Java类文件在编译过后,会产生至少一个.class文件包含大量冗余信息,.SDK中的dex工具会把所有 的.class文件内容整合到一个.dex文件中。通常一个应用apk只有一个classes.dex,但是开启了multiDexEnabled true分包功能可以生成多个.dex文件。即减少了整体文件的尺寸和IO操作,也提高了类的查找速度。增加了对新的操作码的支持,使文件结构尽量简洁,使用等长的指令,借以提高解析速度。
3、什么是ART虚拟机,和JVM/DVM有什么不同?
ART(Android Runtime)是Android 4.4发布的,用来替换Dalvik虚拟,Android 4.4之前默认采用的还是DVM,系统会提供一个选项来开启ART模式。在Android 5.0时,默认采用ART,DVM也从此退出历史舞台。
Dalvik虚拟机执行的是dex字节码,ART虚拟机执行的是本地机器码。
Dalvik执行的是dex字节码,依靠JIT编译器去解释执行,运行时动态地将执行频率很高的dex字节码翻译成本地机器码,然后在执行,但是将dex字节码翻译成本地机器码是发生在应用程序的运行过程中,并且应用程序每一次重新运行的时候,都要重新做这个翻译工作,因此,即使采用了JIT,Dalvik虚拟机的总体性能还是不能与直接执行本地机器码的ART虚拟机相比。
安卓运行时从Dalvik虚拟机替换成ART虚拟机后,并不要求开发者重新将自己的应用直接编译成目标机器码,也就是说,应用程序仍然是一个包含dex字节码的apk文件。在安装应用的时候,dex中的字节码将被编译成本地机器码,之后每次打开应用,执行的都是本地机器码。移除了运行时的解释执行,效率更高,启动更快。(安卓在4.4中发布了ART运行时)
ART优点:
①系统性能显著提升
②应用启动更快、运行更快、体验更流畅、触感反馈更及时
③续航能力提升
④支持更低的硬件
ART缺点
①更大的存储空间占用,可能增加10%-20%
②更长的应用安装时间(还要将字节码将编译成本地机器码)