Dalvik 虚拟机和 ART 虚拟机的区别

01 Apr 2019

Dalvik 虚拟机

简介

是由 Google 等厂商合作开发的 Android 移动设备平台的核心组成部分之一,可以支持转换为 DEX 格式的 Java 应用程序的运行。其中 DEX 格式就是专门为 Dalvik 虚拟机设计的一种压缩格式,适合内存和处理器速度有限的系统。

特性

ART 虚拟机

简介

ART 是 Android Runtime 的缩写。是由 Google 公司研发的新一代虚拟机,在 2013 年 Android 4.4 系统发布的同时发布了 ART 的预览版,最终在 Android 5.0 上正式发布,取代了以往的 Dalvik 虚拟机。

特性

区别

编译技术角度

JIT 介绍

Android 系统发布之初,Dalvik 通过处理 dex/odex 文件来运行 Java 应用程序,从 Android 2.2 Froyo 开始,Google 在 Dalvik 虚拟机中加入了 Just-In-Time Compiler ,即 JIT 编译器。其主要工作是对执行次数频繁的 dex/odex 代码进行编译与优化,将 dex 格式的字节码翻译成精简的 Native Code 去执行,将 Dalvik 的性能提升了 3~6 倍。

AOT 介绍

AOT (Ahead-of-time) 是随着 ART 虚拟机开始发布于 Android 4.4 KitKat 。其主要工作是在应用安装的时候启动 dex2oat 过程把 dex 预编译成 ELF 可执行文件,这样就将应用程序变成了本地应用,不需要每次运行的时候都进行重新编译。其整个过程与 Dalvik 的 JIT 对比如下:

JIT 和 AOT 工作流程对比图

总结

先回顾 JIT 编译器,每次程序启动的时候都会进行 JIT 过程,这也从它的名字体现出来了,它实际是一个动态的重复的过程。这页导致运行时比较耗电,整个过程如下所示:

JIT 编译过程

与 JIT 不同的是,AOT 在应用安装期间执行,将 Java 应用变成了本地应用,运行时相比之前没有多余的解释过程,所以运行地更流畅了,同时解决了 JIT 带来的耗电问题。但同时,其静态执行的特性导致安装过程变慢,还需要更多存储空间存储 ELF 文件。其整个过程如下:

AOT 编译过程

事实上,从 Android 7.0 Nougat 开始,为了进一步解决 AOT 引来的新问题,JIT 重新回归,和 AOT 一起进一步改善 Android 应用程序安装以及运行的性能:

AOT/JIT 混合模式

在这种模式下,应用在安装时不进行 dex2oat 过程,所以安装依然变快了。运行时 dex/odex 文件解释执行,在这个过程中,虚拟机会识别出热点函数,将 JIT 运用在这些热点函数上,编译后的产物存储在 JIT Code Cache 并生成 profile 文件记录热点函数信息。当手机在空闲的时候,系统扫描 App 目录下的 profile 文件执行 AOT 过程。如此一来,运行时的性能以及耗电问题也得到了解决。

内存角度

Dalvik 堆内存结构

Dalvik 内存结构

Dalvik 虚拟机将运行时堆划分为三个区块:

ART 堆内存结构

ART 内存结构

相比 Dalvik 多了两个区块:

总结

相比 Dalvik ,ART 新增两个内存块,提升了内存分配的效率,并有效减少了碎片的产生,同时对 GC 也产生了正面影响。

GC 角度

GC 的类型

ART 所做的优化

参考

https://juejin.im/post/5c232907f265da61662482b4

https://source.android.com/devices/tech/dalvik