Dalvik
Dalvik是Google公司自己设计用于Android平台的Java虚拟机。它是Android移动设备平台的核心组成部分之一,可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行。.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。此外,Dalvik虚拟机基于寄存器,与标准Java虚拟机(JVM)基于栈的架构存在显著差异。
- 原理:一个应用首先经过DX工具将class文件转换成Dalvik虚拟机可以执行的dex文件,然后由类加载器加载原生类和 Java类。Dalvik虚拟机负责解释器根据指令集对Dalvik字节码进行释dex文件为机器码。
- JIT编译器:Dalvik负责将dex翻译为机器码交由系统调用,有一个缺陷,每次执行代码,都需要Dalvik将操作码代码翻译为机器对应的微处理器指令,然后交给底层系统处理,运行效率很低。JIT编译器,当App运行时,每当遇到一个新类,JIT编译器就会对这个类进行即时编译,经过编译后的代码,会被优化成相当精简的原生型指令码(即native code),这样在下次执行到相同逻辑的时候,速度就会更快。
- Dalvik的启动流程:Dalvik进程管理是依赖于linux的进程体系结构的,如要为应用程序创建一个进程,它会使用linux的fork机制来复制一个进程。
ART
ART(Android Runtime)是Android平台上的一个运行时环境,用于执行Android应用程序。它是Android操作系统的重要组成部分,为应用程序提供了执行环境。
ART是在Android 5.0(API级别21)中引入的,旨在改进应用程序的执行性能和兼容性。在ART出现之前,Android使用的是Dalvik虚拟机作为其运行时环境。与Dalvik相比,ART在运行应用程序时进行了更多的优化和编译,从而提高了应用程序的执行效率和稳定性。
当应用程序在Android设备上安装时,ART会将其转换为已优化的机器代码,这有助于提高应用程序的运行速度。此外,ART还支持即时编译(JIT),这意味着它在运行时将字节码转换为机器代码,进一步提高了应用程序的执行效率。
- 原理:JIT是运行时编译,这样可以对执行次数频繁的dex代码进行编译和优化,减少以后使用时的翻译时间, 但将dex翻译为本地机器码也要占用时间。ART的策略与Dalvik不同,在ART环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。之后打开App的时候,不需要额外的翻译工作,直接使用本地机器码运行,因此运行速度提高。
- AOT:AOT是静态编译,应用在安装的时候会启动dex2oat过程把dex预编译成ELF文件,每次运行程序的时候不用重新编译。
使用ART的好处:
区别
ART和Dalvik在执行方式、编译优化和性能方面存在显著差异。ART通过预编译和全面优化提供了更高的执行效率和稳定性,而Dalvik则更注重在有限内存中的并发执行能力。随着Android版本的演进,ART逐渐成为默认的运行时环境,以提供更好的应用程序性能和用户体验。
Dalvik使用JIT,ART结合了两者的优势,使用AOT+JIT(Android7.0之后混合使用,Android5.0-Android7.0之前使用AOT)DVM时为32位CPU设计的,而 ART支持64位并兼容32位CPU,这也是DVM被淘汰的主要原因之一。ART对垃圾回收机制进行了改进,比如更频繁地执行并行垃圾收集,将GC暂停由2次减少为1次等。
总结一下,它们之间存在一些关键的区别,主要表现在执行方式、编译优化和性能等方面。