Android虚拟机Dalvik和ART详解( 二 )

  • AOT编译(Ahead-Of-Time):应用安装时全量编译所有代码为本地机器码,运行时直接执行机器码 。
  • 3、ART 如何运作(1)4.4~7.0最开始ART只采用AOT编译,在App安装时就编译所有代码存储在本地,打开App直接运行,这样做的优点是应用运行速度变快,缺点也很明显,App安装时间明显变长,而且占用存储空间较大
    (2)7.0Android N之后对于ART进行改动,重新引入了JIT编译,结合使用AOT/JIT混合编译,主要机制如下:
    • 安装时不进行任何编译,前几次运行仅通过解释器解释运行,同时对热点代码进行JIT编译,并将这些代码的相关信息记录在一个配置文件里
    • 设备处于空闲和充电状态时,编译守护进程读取配置文件对热点代码进行AOT编译并写入到app对应的odex文件中
    • 再次启动应用后优先使用AOT编译过的代码,否则使用解释器+JIT编译,重复这个过程
    • 对于一些庞大的APP,比如某宝,有些功能可能你一辈子都不会用到,根据上述策略这部分代码就不会被编译保存,从而减少了存储空间的占用 。另外,在系统升级时也避免了全量编译所有现存应用造成的时间空间消耗 。
    (3)8.0Android 8.0引入了.vdex文件,它里面包含 APK 的未压缩 DEX 代码,以及一些用于加快验证速度的元数据.
    4、ART垃圾收集器优化
    • 只有一次GC暂停(Dalvik需要两次) 。
    • 并发复制,可减少后台内存使用和碎片 。
    • GC暂停的时间不受堆大小影响 。
    • 在清理最近分配的短时对象这种特殊情况中,回收器的总GC时间更短 。
    • 优化了垃圾回收的工效,能够更加及时地进行并行垃圾回收,这使得GC_FOR_ALLOC事件在典型用例中极为罕见 。
    5、ART时间线
    • Android 4.4 ,ART和Dalvik是共存的,用户可以在两者之间进行选择 。
    • Android 5.0,正式取代Dalvik虚拟机成为Android虚拟机运行环境,Dalvik退出历史舞台,AOT取代JIT 。
    • Android 7.0,JIT回归,采用JIT和AOP混合编译模式 。
    • ART持续更新优化
    6、Dalvik VM 和 ART VM 有什么区别
    • ART早期使用AOT技术,后期使用AOT+JIT混合,而Dalvik使用JIT 。
    • ART支持64位CPU并兼容32位CPU,而Dalvik只支持32位CPU 。
    • ART对垃圾收集器进行了改进优化,提高了吞吐量 。
    总结核心内容就一句话:App安装时不编译代码只校验合法性,运行时通过解释器执行,将运行频繁的代码进行编译放到内存缓存并且记录在本地配置文件,后台线程编译配置文件记录的方法存放到.odex文件,再次运行App时优先读.odex文件中编译后的代码,然后重复这个过程 。




    推荐阅读