美文网首页
Android虚拟机 -- ART

Android虚拟机 -- ART

作者: TomyZhang | 来源:发表于2019-07-05 17:25 被阅读0次

    一、概念

    2014年10月16日,Google发布Android 5.0(棒棒糖Lollipop),ART全面取代Dalvik成为Android虚拟机运行环境,至此,Dalvik退出历史舞台。

    ART代表Android Runtime,其处理应用程序执行的方式完全不同于Dalvik,Dalvik是使用字节码解释器与JIT即时编译器来执行代码。而ART则是在应用安装时就将字节码编译成本地机器码,这一机制叫Ahead-Of-Time (AOT)编译。

    优点:

    • 应用程序启动更快。
    • 执行更有效率。

    缺点:

    • 需要更大的存储空间。
    • 需要更长的应用安装时间。
    • 系统升级时所有应用都需要重新编译。
      AOT编译生成的oat文件会引用Framework中的代码,一旦系统发生升级,Framework中的实现发生变化,就需要重新修正所有应用程序的oat文件,使得它们的引用是正确的,这就需要重新编译所有的应用。

    二、Dalvik字节码

    作为运行时的ART可执行Dalvik可执行文件并遵循dex字节码规范。

    在应用程序安装时,ART使用dex2oat工具将dex文件编译成oat格式的文件,oat文件中既包含了dex文件中原先的内容,也包含了已经编译好的本地机器码。

    三、AOT编译与JIT即时编译器

    AOT编译:
    Ahead-of-time(AOT)是相对于Just-in-time(JIT)而言的。JIT是在运行时进行字节码到本地机器码的编译,这也是为什么Java普遍被认为效率比C++差的原因。无论是解释器的解释还是运行过程中即时编译,都比C++编译出的本地机器码执行多了一个耗费时间的过程。而AOT就是向C++编译过程靠拢的一项技术:当APK在安装的时候,系统会通过一个名称为dex2oat的工具将APK中的dex文件编译成包含本地机器码的oat文件存放下来。这样做之后,在程序执行的时候,就可以直接使用已经编译好的机器码以加快效率。

    ART与Dalvik整体流程_基于Android5.0

    2016年8月22日,Google发布Android 7.0(牛轧糖Nougat),JIT即时编译器回归,形成AOT/JIT混合编译模式。
    这种混合编译模式的特点是:

    • 应用在安装的时候dex不会被AOT编译。
    • 应用在运行时dex文件先通过解释执行,与此同时,热点代码会被识别并被JIT即时编译器编译成本地机器码后存储在jit code cache中,并生成profile文件以记录热点代码的信息。
    • 手机进入空闲和充电状态的时候,系统会扫描App目录下的profile文件并执行AOT编译。

    可以看出,混合编译模式综合了AOT和JIT的各种优点,使得应用在安装速度加快的同时,运行速度、存储空间和耗电量等指标都得到了优化。

    AOT/JIT混合编译模式

    四、指令集架构

    同Dalvik虚拟机,基于寄存器架构。

    五、垃圾收集器

    ART有多个不同的GC方案,这些方案包括运行不同垃圾回收器。默认方案是CMS(并发标记清除)方案。除CMS方案外,当应用将进程状态更改为察觉不到卡顿的进程状态(例如,后台或缓存)时,ART将执行堆压缩。

    ART还引入一种基于位图的新内存分配程序,称为RosAlloc。在RosAlloc中,允许在线程本地区域存储小对象,这就避免了全局锁的等待时间,因而性能优于Dalvik虚拟机使用的DlMalloc。

    相关文章

      网友评论

          本文标题:Android虚拟机 -- ART

          本文链接:https://www.haomeiwen.com/subject/kpoehctx.html