ART与Dalvik、JVM之间的关系你懂了吗?

认识了解虚拟机

JVM

JVM是 java虚拟机,是实现java夸平台的主要方式,可以使得java这样的高级语言编译成机器可以识别的机器语言,让java 可以一次编译,到处运行。
运行文件格式:.class文件,基于栈

Dalvik

Dalvik 是Android系统在上面运行的虚拟机DVM,Dalvik虚拟机是专门为移动设备定制的,它允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用都是一个独立的Linux进程。独立的进程可以防止虚拟机崩溃的时所有进程都被关闭。Dalvik 是一个基于 JIT(Just in time)编译的引擎。
【补充】:Dalvik是Google公司与其他厂商合作开发设计用于Android平台的虚拟机,是Android移动设备平台的核心组成部分之一。
运行文件格式:.dex格式的Java应用程序,基于寄存器

ART

ART 是 Android 上的应用和部分系统服务使用的托管式运行时环境(Android Runtime),安卓4.4 KitKat之后推出ART,从Android 5.0 Lollipop开始,默认ART替换了Dalvik虚拟机,同时ART也完全兼容Dalvik。该虚拟机采用的是AOT(Ahead of time)编译,7.0后系统采用的是结合使用 AOT、即时 (JIT) 编译和配置文件引导型编译,一种混合模式。
运行文件格式:.dex格式的Java应用程序,基于寄存器

即时编译器(Just In Time,JIT)

DVM中的应用每次运行时,通过JIT实时的将一部分 Dalvik 字节码翻译成机器码(native execution) ,在程序的执行中.dex不断被编译并提前缓存。
优点:消耗的更少的内存,占用的更少的物理存储空间
缺点:使应用的运行效率降低

预先编译器(Ahead-Of Time,AOT)

ART系统在**第一次安装应用(只发生在应用安装)时会进行一次预编译(Ahead Of Time,AOT),将.dex字节码文件预先编译成机器码(native execution)**并存在本地,这样应用每次运行时就不需要再执行编译了,能大大提高运行效率。
优点: 1. 占用较少的CPU资源,消耗更少的电量 ;2. 减少启动时间;3不用即时翻译,可省电 ;4:改善垃圾回收器;5. 应用运行更快,直接执行机器码,.dex文件已经在安装时翻译好了
缺点:1. 安装时需要AOT,安装时间更久; 2. 需要额外的空间存储编译的机器码

相关术语

.dex文件

.dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。

在Android中,.java被编译成.class文件后,多个class文件会被相关工具打包成class.dex放在apk中。比如Android studio用SDK的dx命令可以打包指定的.class为.dex。

汇编器

它直接将汇编语言翻译成机器码,所以它的速度非常快。

编译器

它将源码翻译成汇编语言,然后再用汇编器转换成机器码。这种方式编译过程很慢但是执行速度很快。但是使用编译器最大的问题是编译出来的机器码依赖于特定的平台。换句话说,在一台机器上可以运行的代码在另一台不同的机器上可能就无法运行。

解释器

它在执行程序时才翻译代码。由于代码翻译是在执行阶段才发生,所以执行速度很慢。

Multidex

在android5.0之前,每个android应用只含有一个dex文件,dex的方法数量被限制在了65535之内,导致apk引入大量第三方sdk后方法数量超过限制无法编译通过。为了解决这个问题,Google推出多dex文件的解决方案multidex,一个apk可以包含多个dex文件。通过Multidex.install(this)完成dex文件的加载。

Android4.4时开始引入ART,在5.0以后终端默认虚拟机选择ART,ART是支持多个.dex文件的。

补充说明

ART对Dalvik的兼容

ART使用设备自带的dex2oat工具来编译应用。此工具将dex文件编译为应用可执行文件。 但是一些后处理工具会生成无效文件,Dalvik可以接受这些文件,但是ART无法编译这些文件。所以ART只是基本上兼容Dalvik,不是不完全。

ART对垃圾回收的优化措施

  1. 只有一次(而非两次)GC 暂停
  2. 在 GC 保持暂停状态期间并行处理
  3. 在清理最近分配的短时对象这种特殊情况中,回收器的总 GC 时间更短
  4. 优化了垃圾回收的工效,能够更加及时地进行并行垃圾回收,这使得 GC_FOR_ALLOC 事件在典型用例中极为罕见
  5. 压缩 GC 以减少后台内存使用和碎片

Android 为什么要使用虚拟机?

Android 使用虚拟机作为其运行环境是为了运行 APK 文件构成的 Android 应用。

  1. 应用代码和核心的操作系统分离。所以即使任意一个程序中包含恶意的代码也不会直接影响系统文件。这使得 Android 操作系统更稳定可靠。
  2. 它提高了跨平台兼容性或者说平台独立性。这意味着即使某一个应用是在 PC 上编译的,它也可以通过虚拟机在移动平台上执行。

Dalvik与JVM的比较

  1. Dalvik占用更少的空间;
  2. 为简化翻译,常量池只使用32位索引;3.标准Java字节码实行8位堆栈指令,Dalvik使用16位指令集直接作用于局部变量。局部变量通常来自4位的“虚拟寄存器”区。这样减少了Dalvik的指令计数,提高了翻译速度。
  3. 一般来说,基于堆栈的机器必须使用指令才能从堆栈上的加载和操作数据,因此,相对基于寄存器的机器,它们需要更多的指令才能实现相同的性能。但是基于寄存器机器上的指令必须经过编码,因此,它们的指令往往更大。
  4. Dalvik虚拟机既不支持Java SE 也不支持Java ME类库(如:Java类,AWT和Swing都不支持)。 相反,它使用自己建立的类库(Apache Harmony Java的一个子集)。

Dalvik的部分机制原理

  1. 当Android启动时,Dalvik VM 监视所有的程序(APK),并且创建依存关系树,为每个程序优化代码并存储在Dalvik缓存中。Dalvik第一次加载后会生成Cache文件,以提供下次快速加载,所以第一次打开程序会很慢。
  2. Dalvik解释器采用预先算好的Goto地址,每个指令对内存的访问都在64字节边界上对齐。这样可以节省一个指令后进行查表的时间。为了强化功能, Dalvik还提供了快速翻译器(Fast Interpreter)。

Android 7.0之后采用解释、JIT、AOT混合执行方案

在Android N 中对其 ART做了比较大的变化。主要是同一程序的代码可能同时运行在本地机器码(编译)、解释和JIT(Just In Time)的混合运行模式,并且不同的用户,同一应用程序的代码,可能运行不同的编译代码。因为有了Profile-guided JIT/AOT Compilation,那么不同的用户行为对同一app可能会有不同的编译结果。N 上做此变化的其目的是为了在安装时间、内存占用、电池消耗和性能之间获得最好的折衷。

**新的方案即是:**当设备idle和充电的时候,ART会执行针对“热代码”进行AOT编译,其他代码不做编译。为了得到更优的代码,ART采用了几种技巧包括深度内联。
对同一个应用可以编译数次,或者找到变“热”的代码路径或者对已经编译的代码进行新的优化,这取决于分析器在随后的执行中的分析数据。
这种混合使用AOT、解释、JIT的策略相比于单纯的AOT或JIT有如下优点:

  1. 即使是大应用,安装时间也能缩短到几秒
  2. 系统升级能更快地安装,因为不再需要优化这一步
  3. 应用的内存占用更小,有些情况下可以降低50%
  4. 改善了性能,更低的电池消耗

JVM、DVM、ART对比示意图

`图片参考唐先僧

请添加图片描述

该篇博客纯属个人观点和见解,如有错误恳请留言指正,万分感激!请添加图片描述
该篇博客纯属个人观点和见解,如有错误恳请留言指正,万分感激!
参考链接:
https://www.jianshu.com/p/bdb6c29aca83

猜你喜欢

转载自blog.csdn.net/luo_boke/article/details/106004778