安卓虚拟机ART和Dalvik


一、JVM和Dalvik

Android应用程序运行在Dalvik/ART虚拟机,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。
Dalvik虚拟机实则也算是一个Java虚拟机,只不过它执行的不是class文件,而是dex文件。
Dalvik虚拟机与Java虚拟机共享有差不多的特性,差别在于两者执行的指令集是不一样的,前者的指令集是基本寄存器的,而后者的指令集是基于堆栈的。

.Java Virtual MachineDalvik Virtual Machine
Instruction SetJava Bytecode(Stack Based)Dalvik Bytecode(Register Based)
File Format.class file(one file, one class).dex file(one file, many classes)

那什么是基于栈的虚拟机, 什么又是基于寄存器的虚拟机?

1.1 基于栈的虚拟机

对于基于栈的虚拟机来说, 每一个运行时的线程, 都有一个独立的栈。 栈中记录了方法调用的历史, 每有一次方法调用, 栈中便会多一个栈桢。 最顶部的栈桢称作当前栈桢, 其代表着当前执行的方法。 基于栈的虚拟机通过操作数栈进行所有操作。

在这里插入图片描述

字节码指令

在这里插入图片描述

执行过程

test方法
地址 指令
0 ICONST_1
1 ISTORE 0
2 ICONST_2
3 ISTORE 1
4 ILOAD 0
5 ILOAD 1
6 IADD
7 ISTORE 2
8 RETURN

过程:
在这里插入图片描述

1.2 基于寄存器的虚拟机

基于寄存器的虚拟机中没有操作数栈, 但是有很多虚拟寄存器。 其实和操作数栈相同, 这些寄存器也存放在运行时栈中, 本质上就是一个数组。 与JVM相似, 在Dalvik VM中每个线程都有自己的PC和调用栈, 方法调用的活动记录以帧为单位保存在调用栈上。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

与JVM版相比, 可以发现Dalvik版程序的指令数明显减少了, 数据移动次数也明显减少了。


二、ART与Dalvik

Dalvik虚拟机执行的是dex字节码, 解释执行。 从Android 2.2版本开始, 支持 JIT即时编译(just in time),在程序运行的过程中进行选择热点代码( 经常执行的代码) 进行编译或者优化。
而ART( Android Runtime) 是在 Android 4.4 中引入的一个开发者选项, 也是 Android 5.0 及更高版本的默认 Android 运行时。 ART虚拟机执行的是本地机器码。 Android的运行时从Dalvik虚拟机替换成ART虚拟机,并不要求开发者将自己的应用直接编译成目标机器码, APK仍然是一个包含dex字节码的文件。

那么, ART虚拟机执行的本地机器码是从哪里来?

dex2aot

Dalvik下应用在安装的过程, 会执行一次优化, 将dex字节码进行优化生成odex文件。 而Art下将应用的dex字节码翻译成本地机器码的最恰当AOT时机也就发生在应用安装的时候。 ART 引入了预先编译机制(Ahead of time ), 在安装时, ART 使用设备自带的 dex2oat 工具来编译应用, dex中的字节码将被编译成本地机器码。

Android N的运作方式

ART 使用预先 (AOT) 编译, 并且从 Android N混合使用AOT编译, 解释和JIT。
1、 最初安装应用时不进行任何 AOT 编译( 安装又快了) , 运行过程中解释执行, 对经常执行的方法进行JIT,经过 JIT 编译的方法将会记录到Profile配置文件中。
2、 当设备闲置和充电时, 编译守护进程会运行, 根据Profile文件对常用代码进行 AOT 编译。 待下次运行时直接使用。

三、总结

Android 虚拟机主要有两种:Dalvik 虚拟机和 ART(Android Runtime)虚拟机。这两种虚拟机在 Android 系统中扮演着不同的角色。

Dalvik 虚拟机
Dalvik 虚拟机是 Android 系统早期使用的虚拟机,被设计用于在资源受限的移动设备上运行 Android 应用程序。
Dalvik 虚拟机使用基于寄存器的指令集,每个应用程序在运行时会被编译成 Dalvik 字节码,然后由 Dalvik 虚拟机解释执行。
Dalvik 虚拟机采用的是 JIT(Just-In-Time)编译方式,即在运行时将字节码实时编译为本地机器代码执行,以提高应用程序的性能。
ART 虚拟机
ART 虚拟机是 Android 5.0(Lollipop)及以后版本引入的新一代运行时环境。
ART 虚拟机使用基于 Ahead-Of-Time(AOT)编译的方式,即在应用安装时将字节码预先编译为本地机器代码,然后存储在设备上,以减少运行时的编译开销。

ART 虚拟机在应用安装时会将字节码转换为本地机器代码,这使得应用程序在运行时更快,减少了启动时间和内存占用。
总的来说,ART 虚拟机相比于 Dalvik 虚拟机在性能上有一定的优势,尤其是在应用启动速度和运行时性能方面。因此,Android 系统逐渐向 ART 虚拟机转变,许多新的 Android 版本都默认采用 ART 虚拟机作为运行时环境。

在 Android Nougat(Android 7.0)及之后的版本中,ART(Android Runtime)虚拟机引入了一种混合编译的方式,同时结合了 Ahead-Of-Time(AOT)编译、解释和 Just-In-Time(JIT)编译的特性。这种混合编译的方式旨在提高应用程序的性能和启动速度,同时减少内存占用。

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深入理解Android虚拟机ART,需要对ART的原理、架构和功能进行全面的了解。 ARTAndroid Runtime)是Android操作系统中的一种虚拟机,它在Android 5.0及以后的版本中取代了Dalvik虚拟机ART通过对应用程序的预编译,将字节码转换为机器码,提供了更的性能和更低的内存占用。 ART的内部架构由多个模块组成,包括编译器、运行时库和垃圾回收器。编译器模块负责将应用程序的字节码转换为本地机器码,采用了提前编译(Ahead-of-Time Compilation)的方式,将代码的热点部分提前编译为本地机器码,从而加速应用程序的执行。运行时库模块提供了与设备硬件和操作系统交互的接口,同时实现了一些Java虚拟机的功能,如线程管理和异常处理。垃圾回收器模块负责管理内存资源,通过回收不再使用的对象,提供了更好的内存管理能力。 ART提供了一些新的特性,如增强的垃圾回收、即时编译和应用程序优化等。其中,增强的垃圾回收机制使用了新的分代垃圾回收算法,能更好地管理内存资源,减少应用程序的内存占用。即时编译(Just-In-Time Compilation)可以将应用程序的热点代码实时编译为机器码,在应用程序的执行过程中提升性能。应用程序优化功能可以分析应用程序的运行状况,根据实际情况进行优化,提供更好的用户体验。 总之,深入理解Android虚拟机ART需要详细了解其原理、架构和功能,同时还需要研究相关的性能优化方法和工具。只有全面了解ART,才能更好地开发和优化Android应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值