JVM和DVM
JavaSE 程序使用的虚拟机叫 Java Virtual Machine,简称 JVM。Android 平台虽然是使用java语言来开发应用程序,但Android程序却不是运行在标准java虚拟机上的,谷歌专门为Android平台设计了一套虚拟机来运行Android程序,它就是Dalvik虚拟机。Dalvik虚拟机执行的是已转换为 .dex(即 Dalvik Executable)格式的 Java 应用程序,.dex 格式是专为 Dalvik 设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个 Dalvik 应用作为一 个独立的 Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
Dalvik虚拟机的特点
- 体积小,占用内存空间小。
- 专有的DEX可执行文件格式,体积更小,执行速度更快。
- 常量池采用32位索引值,寻址类方法名、字段名、常量更快。
- 基于寄存器架构,基于寄存器的虚拟机对于编译后变大的程序来说,在它们执行的时候,花费的时间更短。
- 提供了对象生命周期管理、堆栈管理、线程管理、安全和异常管理以及垃圾回收等重要功能。
- 所有的Android程序都运行在Android系统进程里,每个进程对应着一个Dalvik虚拟机实例。
Dalvik虚拟机的一些细节
- Dalvik 主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等重要功能;
- Dalvik 负责进程隔离和线程管理,每一个 Android 应用在底层都会对应一个独立的 Dalvik 虚拟机实例,其代码在虚拟机的解释下得以执行;
- 不同于 Java 虚拟机运行 Java 字节码,Dalvik 虚拟机运行的是其专有的文件格式 Dex;
- dex 文件格式可以减少整体文件尺寸,提高 I/O 操作的类查找速度;
- odex 是为了在运行过程中进一步提高性能,对 dex 文件的进一步优化;
- 所有的 Android 应用的线程都对应一个 Linux 线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理机制;
- 有一个特殊的虚拟机进程 Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生, 它会完成虚拟机的初始化,库的加载,预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的数据提供给系统。对于一些只读的系统库,所有虚拟机实例都和 Zygote 共享一 块内存区域;
- Dalvik 是由 DanBornstein 编写的,名字来源于他的祖先曾经居住过名叫 Dalvík 的小渔村,村子位于冰岛。
Davilk产生背景
Davilk虚拟机作为Android平台的一部分.Google公司花了大量时间思考针对低功耗手持设备的优化设计。在智能手机出现之前,与桌面设备相比,手持设备在内存和速度方面落后8-10年,它们的计算能力也有限。结果,手机的性能需求变得很严格,要求手机设计人员优化所有因素。如果查看Android中的包列表,你将会看到它们的功能全面而丰富。
这些问题使Google公司在许多方面重新审视标准JVM实现。Dan Bomstein对Google公司的这个JVM实现作出了重要贡献,他编写了Dalvik VM,Dalvik是冰岛一个小镇的名称。
- 首先,Dalvik VM获取生成的Java类文件,将它们组合为一个或多个Dalvik可执行文件(.dex)。它重用多个类文件中的重复信息,与未压缩的传统.jar文件相比,有效地将空间需求减少了一半。
- 其次,Google公司在Dalvik VM中对垃圾收集进行了调优,但它在早期版本中选择了删除java经典的JIT(Just-In-Time,即时)编译器。后来,Android 2.3添加了JIT.报告称这可在各种场所提供快2到5倍的原始性能,将通用应用程序的性能提升10%-20%。
- 最后,Dalvik VM使用了一种不同的汇编代码生成方法,它使用寄存器而不是栈作为主要的数据存储单元。Google公司希望这样能将指令减少到30%。应当指出,采用Dalvik VM的一个结果是,Android中最终的可执行程序代码不是基于Java字节码,而是基于.dex文件。这意味着无法直接执行Java字节码,必须首先得到Java类文件,然后将它们转换为可链接的.dex文件。
这种对性能的*追求还扩展到了Android SDK的其他部分。例如:Android SDK大量使用XML来定义相应布局。然而,所有XML数据必须编译为二进制文件,然后才能将这些文件存储在设备上。Android提供了一些专门的机制来处理XML数据。
ART简介
由于虚拟机的限制,android有了相应的性能瓶颈,因此在android 4.4时候引入art(Android Runingtime)虚拟机。Android 4.4提供了一种与Dalvik截然不同的运行环境ART支持,ART源于google收购的Flexycore的公司。ART模式与Dalvik模式最大的不同在于,启用ART模式后,系统在安装应用的时候会进行一次预编译,将字节码转换为机器语言存储在本地,这样在运行程序时就不会每次都进行一次编译了,执行效率也大大提升。
刚出现时,ART还不够成熟,需要测试,所以默认虚拟机是DVM。国内的ROM厂商直接把ART给割了。Android5.0起,默认使用ART虚拟机,删掉了DVM。两者的功能是一样的,都是将.class文件转为机器码执行程序。区别之处在于 将.class文件转为机器码的时候。
- DVM:实时。每次运行应用的时候,实时将字节码转化为机器码,再运行程序。中间多了一道转换手续,使得程序响应需要更多的时间,因为实时,消耗了更多的电量,内存。(这就是相同配置的手机Android不如Apple流畅的原因。)
- ART:安装时。在安装应用的时候,就将应用的字节码转换为机器码,保存在手机里。每次运行应用的时候,无需实时转换,直接使用转换好的机器码。打开应用更快,应用响应更及时,内存占用,电量消耗都减少。(拉近了与Apple的流畅距离)
ART优点
- 1、系统性能的显著提升。
- 2、应用启动更快、运行更快、体验更流畅、触感反馈更及时。
- 3、更长的电池续航能力。
- 4、支持更低的硬件。
ART缺点
- 1、更大的存储空间占用,可能会增加10%-20%。
- 2、更长的应用安装时间。
ART模式
ART 模式英文全称为:AndroidRunTime,谷歌从 Android4.4 系统开始新增的一种应用运行模式, 与传统的 Dalvik 模式不同,ART 模式可以实现更为流畅的 Android 系统体验。在 4.4 系统之前,Android 系统在 Linux 的底层下构筑 Dalvik 一层的虚拟机,通过其可以更好适应多样的硬件架构,开发者只需要按一套规则进行应用便可,无需因为不同的硬件架构而处理与底层的驱动关系,从而大大提高开发的效率,但因为应用均是运行在 Dalvik 虚拟机中,因此应用程序每次运行的时候,一部分代码都需要重新进行编译,这过程需要消耗一定的时间和降低应用的执行效率, 最明显的便是拖延了应用的启动时间和降低了运行速度。 ART模式有什么作用? ART 模式最大的作用就是提升了 Android 系统流畅度,相比 Dalvik 模式中出现的耗电快、占用内存大、即使是旗舰机用久了也会卡顿严重等现象,ART模式中这种问题得到了很好的解决,通过在安装应用程序时,自动对程序进行代码预读取编译,让程序直接编译成机器语言,免去了 Dalvik 模式要实时转换代码,实现高效率、省电、占用更低的系统内存、手机运行流畅。
ART模式的缺点同一款应用安装后比DVM占更多的空间,多出的空间用来保存机器码了,安装时间也更长点。一个应用里代码的大小是很小的,大都是资源素材大,因而多出的空间是很小的,现在手机都是16G+,不影响使用。JIT与AOT
Android2.3版本提供了JIT机制提升性能,JIT(Just-In-Time),用来在运行时动态地将执行频率很高的dex字节码编译成本地机器码,然后再执行。通过JIT,就可以有效地提高Dalvik虚拟机的执行效率。但是,应用每次运行的时候,部分字节码都需要通过JIT转换为机器码,降低了应用程序运行效率。而ART则是使用AOT(Ahead-Of-Time)进行处理,所谓AOT是指在运行以前就把中间代码静态编译成本地代码,这就减去了JIT运行时的转换时间。因此,即使Dalvik采用了JIT,Dalvik总体性能还是不能与直接执行本地机器码的ART虚拟机相比。