Android 虚拟机

380 阅读6分钟

Android虚拟机是什么

Google公司设计的用于android平台的虚拟机,google参考Java虚拟机,根据移动设备的一些特性进行优化,最终形成了android的虚拟机。android虚拟机是面向Linux,嵌入式操作系统的虚拟机,主要负责生命周期管理、堆栈管理、线程管理、安全和线程管理,垃圾回收等。

android虚拟机有什么特点

  • android虚拟机体积小、占用内存空间小
  • 基于寄存器的指令集合使得android虚拟机性能更好、执行更高效。每个进程对应一个虚拟机。最后,android虚拟机支持dex可执行文件格式。

Android 虚拟机与JVM对比

  • android虚拟机CPU指令基于寄存器的,而JVM基于栈。基于寄存器的虚拟机对于编译后变大的程序来说,在它们执行的时候,花费的时间更短。
  • android虚拟机执行文件为.dex,而JVM运行java字节码。
  • Dalvik可执行文件体积小。Android SDK中有一个叫dx的工具负责将Java字节码转换为Dalvik字节码。dx工具对Java类文件重新排列,消除在类文件中出现的所有冗余信息,避免虚拟机在初始化时出现反复的文件加载与解析过程。

虚拟机的实现方法

如今虚拟机的实现方式有两种,基于栈的和基于寄存器的,这两种实现方式各有优劣,也都有标志性的产品。

基于栈的虚拟机,有JVM,CPython以及.Net CLR。

基于寄存器的,有Dalvik以及Lua5.0,另外Perl听说也要改为基于寄存器方式。

无论这两种方式实现机制如何,都要实现以下几点:

  • 取指令,其中指令来源于内存
  • 译码,决定指令类型(执行何种操作)。另外译码的过程要包括从内存中取操作数
  • 执行。指令译码后,被虚拟机执行(其实最终都会借助于物理机资源)
  • 存储计算结果

image.png

基于栈的虚拟机

基于栈的虚拟机有一个操作数栈的概念,虚拟机在进行真正的运算时都是直接与操作数栈(operand stack)进行交互,不能直接操作内存中数据(其实这句话不严谨的,虚拟机的操作数栈也是布局在内存上的),也就是说不管进行何种操作都要通过操作数栈来进行,即使是数据传递这种简单的操作。这样做的直接好处就是虚拟机可以无视具体的物理架构,特别是寄存器。但缺点也显而易见,就是速度慢,因为无论什么操作都要通过操作数栈这一结构。

由于执行时默认都是从操作数栈上取数据,那么就无需指定操作数。

由于操作数都是隐式地,所以指令可以做的很短,一般都是一个或者两个字节。但是显而易见就是指令条数会显著增加。

基于栈的虚拟机中指令更加紧凑,一个字节或者两个字节即可存储,同时编译器实现也比较简单,不用进行寄存器分配。

image.png

基于寄存器的虚拟机

基于寄存器的虚拟机中没有操作数栈的概念,但是有很多虚拟寄存器,一般情况下这些寄存器(操作数)都是别名,需要执行引擎对这些寄存器(操作数)的解析,找出操作数的具体位置,然后取出操作数进行运算。

使用寄存器式虚拟机没有基于栈的虚拟机在拷贝数据而使用的大量的出入栈(push/pop)指令。同时指令更紧凑更简洁。但是由于显示指定了操作数,所以基于寄存器的代码会比基于栈的代码要大

image.png

基于栈的虚拟机 VS 基于寄存器的虚拟机 代码比较

image.png

Android 虚拟机的发展历史

最初的android系统采用的是Dalvik虚拟机,之后随着android系统的演进,出现了ART虚拟机。两者最大的区别在于,Dalvik虚拟机采用的是动态编译,而ART采用的是静态编译模式。通常,程序有两种运行方式:静态编译与动态解释。静态编译的程序在执行前全部被翻译为机器码,而动态解释执行的则是一句一句边运行边翻译。

从Android 2.2版本开始,支持JIT即时编译(Just In Time)

在程序运行的过程中进行选择热点代码(经常执行的代码)进行编译或者优化。

Android 4.4 中引入的一个开发者选项

ART(Android Runtime) 是在 Android 4.4 中引入的一个开发者选项,也是 Android 5.0 及更高版本的默认 Android 运行时。ART虚拟机执行的是本地机器码。Android的运行时从Dalvik虚拟机替换成ART虚拟机,并不要求开发者将自己的应用直接编译成目标机器码,APK仍然是一个包含dex字节码的文件。

dex2aot

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

image.png

android 7.0 AOT+解释执行+JIT

ART 使用预先 (AOT) 编译,并且从 Android N混合使用AOT编译,解释和JIT。

1、最初安装应用时不进行任何 AOT 编译(安装又快了),运行过程中解释执行,对经常执行的方法进行JIT,经过 JIT 编译的方法将会记录到Profile配置文件中。

2、当设备闲置和充电时,编译守护进程会运行,根据Profile文件对常用代码进行 AOT 编译。待下次运行时直接使用。

image.png

android 8.0 ART改进

新的并发压缩式垃圾回收器(GC)。该回收器会在每次执行 GC 时以及应用正在运行时对堆进行压缩,且仅在处理线程根时短暂停顿一次。

开发和调试方面的优化,ART 提供了大量功能来优化应用开发和调试。支持采样分析器,可更准确地了解应用执行情况,而不会明显减慢速度。ART 支持许多新的调试选项,特别是与监控和垃圾回收相关的功能。

如果想了解清楚8.0上的优化可以参看这个博客:blog.csdn.net/zhangbijun1…