你应该知道的android虚拟机

Android系统架构

要想了解android虚拟机,我们首先看一下android的系统架构,看一下android虚拟机所处的位置。Android系统架构如下图所示,在黄色区块就是我们这次介绍的android虚拟机所处的位置,由此可以看出,android虚拟机是运行在Linux系统中,并用来执行android代码。


图1、android系统架构图

android虚拟机和JVM虚拟机

虚拟机是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。虚拟机有自己完善的硬件架构,如处理器、堆栈等,还具有相应的指令系统。

JVM虚拟机是什么?

不是真实的物理机,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机。它没有寄存器,所以指令集是使用Java栈来存储中间数据,这样做的目的就是为了保持Java虚拟机的指令集尽量的紧凑,同时也便于JAVA虚拟机在那些只有很少通用寄存器的平台上实现。所以,JVM本质上就是一个程序。

Java代码执行过程


图2、Java代码编译执行

android虚拟机是什么?

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

android虚拟机有什么特点?

首先,android虚拟机体积小、占用内存空间小。移动设备无论是存储空间、内存资源还是电池资源都是有限的,所以就决定了该特点。

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

Android 虚拟机与JVM对比

1、android虚拟机CPU指令基于寄存器的,而JVM基于栈。基于寄存器的虚拟机对于编译后变大的程序来说,在它们执行的时候,花费的时间更短。

2、android虚拟机执行文件为.dex,而JVM运行java字节码。

3、Dalvik可执行文件体积小。Android SDK中有一个叫dx的工具负责将Java字节码转换为Dalvik字节码。dx工具对Java类文件重新排列,消除在类文件中出现的所有冗余信息,避免虚拟机在初始化时出现反复的文件加载与解析过程。

android虚拟机进化史

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

1、android 1.1 Dalvik:解释器

       最早的虚拟机,采用的是边编译,边执行。每次执行代码,都需要Dalvik将代码转化为机器指令集合,然后交给CPU去执行。

2、android 2.2 Dalvik:解释器+JIT(just-in-time)

       从android2.2之后,Dalvik虚拟机增加了JIT编译技术,主要为了提高android程序的运行效率。执行过程中,每遇到一个新的类别,都会被编译优化成相当精简的原生型指令码,下次执行到相同逻辑的时候,速度就会更快。最开始指在执行前编译,但是到现在已经发展成为,一开始解释执行,只有被多次调用的程序段才被编译,编译后存放在内存中,下次直接执行编译后的机器码。在引入JIT之后,android程序运行效率比之前提升了3-6倍,Google公布的测试数据。

       JIT编译产生的机器指令保存在内存中,不会进行持久化存储,所以应用每次启动都会重新进行编译。

       Dalvik虚拟机执行程序dex文件前,系统会对dex文件做优化,生成可执行文件odex,保存到data/dalvik-cache目录。

       正常的执行流程,安装APK,将dex文件通过Dx工具转化为odex文件,启动APP的时候,采用JIT技术将odex字节码转化为机器指令,CPU执行。


3、android 4.4 ART虚拟机(Android Runtime)

在android kitkat 4.4,google为了提高应用运行时的性能,于是在该版本中出现了就art虚拟机,当然默认的还是Dalvik虚拟机。ART 引入了预先编译机制,可提高应用的性能。ART 还具有比 Dalvik 更严格的安装时验证。

Art采用的是AOT模式,AOT(Ahead-of-time)即在应用安装的时候,dex文件就会被预先编译可执行文件,这个过程就叫做预编译。具体过程,安装APK的时候调用dex2oat,把.dex文件编译oat文件并保存到磁盘中,该文件采用的是成ELF文件格式,该文件格式为native code机器可以直接运行的格式,每次应用启动不用重新编译。所以每次应用启动的时候,启动速度有很大提升,增加了存储空间的使用,也是一种空间换时间的策略,但是安装过程中耗时增加。同时,AOT对Garbage collection过程也进行了改进,但是这样在手淘这样大的app环境下,第一次安装需要1-2min之久,但是在运行时,执行的都是预选编译好的机器码,所有会快很多。Android 5.0之后系统虚拟机彻底切换为ART虚拟机。

ART也在垃圾回收方面的优化,垃圾回收 (GC) 会耗费大量资源,这可能有损于应用性能,导致显示不稳定、界面响应速度缓慢以及其他问题。ART 通过以下几种方式对垃圾回收做了优化:

a.大多采用并发设计,具有一次 GC 暂停

b.并发复制,可减少后台内存使用和碎片

c.GC 暂停的时间不受堆大小影响

d.在清理最近分配的短时对象这种特殊情况中,回收器的总 GC 时间更短

e.优化了垃圾回收的工效,能够更加及时地进行并行垃圾回收,这使得 GC_FOR_ALLOC 事件在典型用例中极为罕见

4、android 7.0 AOT+解释执行+JIT

为了解决在art上的安装时间太长的问题,同时保证在启动APP的时候性能不变,从android7.0开始采用混合模式,即AOT+JIT+解释执行3种模式共存的方式。具体的工作过程如下,首先,在应用安装时dex文件不会被预先编译成机器码。然后,在App运行时,dex文件先通过解释器直接执行,热点函数会被识别并被JIT编译后存储在JIT code cache中并生成profile文件记录热点函数信息。最后当手机进入idle状态或者充电状态,系统扫描app目录下的profile文件进行AOT编译。在这种模式下,无论是首次安装还是APP启动都能够保证很好的效率。


5、android 8.0 ART改进

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

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

引用:

1、百度百科JIT:https://baike.baidu.com/item/JIT%E7%BC%96%E8%AF%91%E5%99%A8/3793585?fr=aladdin

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

你可能感兴趣的:(你应该知道的android虚拟机)