Dalvik与ART的架构差异,你学会了吗?

开发 架构
ART是在Android 5.0(API级别21)中引入的,旨在改进应用程序的执行性能和兼容性。在ART出现之前,Android使用的是Dalvik虚拟机作为其运行时环境。与Dalvik相比,ART在运行应用程序时进行了更多的优化和编译,从而提高了应用程序的执行效率和稳定性。

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的好处:

  1. 提高应用程序的执行速度:由于ART采用了更高效的编译方式,应用程序的运行速度得到了显著提升。
  2. 更好的兼容性:ART对应用程序的代码进行了更全面的优化,减少了因代码问题导致的崩溃或错误。
  3. 更少的内存占用:ART的优化编译方式使得应用程序占用的内存更少,从而提高了设备的整体性能。
  4. 更好的安全性: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次等。

总结一下,它们之间存在一些关键的区别,主要表现在执行方式、编译优化和性能等方面。

  1. 执行方式:Dalvik是依赖于即时编译(JIT)的,它在运行应用程序时将字节码转换为本地机器码。这意味着应用程序的代码在每次运行时都需要被解释和编译,这可能会导致一定的性能开销。相比之下,ART采用预编译(AOT)方式,在应用程序安装时将其编译成本地机器码,从而减少了运行时的编译开销,提高了执行效率。
  2. 编译优化:Dalvik主要关注在有限的内存中同时运行多个虚拟机的实例,而ART则更注重应用程序的执行效率和稳定性。ART在编译过程中会对应用程序代码进行更全面的优化,包括空间优化和时间优化,以实现更快的执行速度和更少的内存占用。
  3. 性能:由于ART采用了预编译和更全面的优化方式,它在执行应用程序时通常表现出更高的性能。与Dalvik相比,ART可以实现更快的启动速度、更流畅的用户体验和更低的功耗。此外,ART还支持更多的语言和框架,使得开发人员能够更加灵活地创建应用程序。



责任编辑:武晓燕 来源: 沐雨花飞蝶
相关推荐

2023-08-28 07:02:10

2024-01-30 18:29:29

微服务架构Ingress

2024-09-09 09:00:12

架构设计算法

2024-02-02 11:03:11

React数据Ref

2022-07-08 09:27:48

CSSIFC模型

2023-08-01 12:51:18

WebGPT机器学习模型

2024-01-02 12:05:26

Java并发编程

2024-01-19 08:25:38

死锁Java通信

2024-02-04 00:00:00

Effect数据组件

2023-07-26 13:11:21

ChatGPT平台工具

2023-01-10 08:43:15

定义DDD架构

2023-12-07 07:03:09

2023-05-18 09:01:11

MBRGPT分区

2024-05-29 07:47:30

SpringJava@Resource

2022-12-06 08:37:43

2023-10-06 14:49:21

SentinelHystrixtimeout

2023-05-05 06:54:07

MySQL数据查询

2022-06-16 07:50:35

数据结构链表

2023-08-26 21:34:28

Spring源码自定义

2024-03-06 08:28:16

设计模式Java
点赞
收藏

51CTO技术栈公众号