android将引入aot编译器,JIT与AOT编译模式
JIT,即Just-in-time,动态(即时)编译,边运行边编译;
AOT,Ahead Of Time,指运行前编译,是两种程序的编译方式
JIT
JIT,即“Just In Time”,翻译过来就是“即时编译技术”。android在2.2版本引入此技术,主要是用来提高程序的执行效率的。 对于会多次执行到的代码(比如某个类的函数、某一个经常使用到的执行路径相关的代码,就是所谓的“热点函数”、“热点trace”),JIT会将其编译成机器码。下次再执行此代码时就直接执行机器码,从而提高了代码的执行效率。
为什么只是对热点函数、热点trace进行JIT编译,而不是全部的字节码?首先,字节码的大部分代码一般不会总是执行到(即执行频率低),而JIT是在程序运行期间编译,编译时又需要时间,在程序运行期间花时间编译一般不会执行到的代码,这不是一个好的选择。所以,JIT只编译热点函数、热点trace,对于非热点的代码仍旧在用到时用解释器去解释成机器码然后执行就可以了。 JIT编译而来的机器码是存储到内存中的,不是在硬盘上。所以,在应用重新启动时,所有的热点代码也都需要使用jit重新编译成机器码。
网上找到一段关于JIT在代码层面实现逻辑的说明,“每启动一个应用程序,都会相应地启动一个dalvik虚拟机,启动时会建立JIT线程,一直在后台运行。当某段代码被调用时,虚拟机会判断它是否需要编译成机器码,如果需要,就做一个标记,JIT线程不断判断此标记,如果发现被设定就把它编译成机器码,并将其机器码地址及相关信息放入entry table中,下次执行到此就跳到机器码段执行,而不再解释执行,从而提高速度”。
JIT是Dalvik虚拟机下的编译模式,随着ART在4.4版本之后替代Dalvik,编译模式也由JIT变为了AOTDalvik从android诞生时就存在,4.4版本之后被ART替代
JIT在android 2.2版本被引入,4.4版本之后被AOT替代
JIT只是对热点函数、热点trace进行编译,非热点函数还是走解释器
JIT编译生成的机器码存储在内存中,应用下次启动时需重新编译热点代码
AOT
ART采取了AOT(Ahead-Of-Time)技术, 因为它是在应用安装时就将字节码编译成了机器码然后存放在本地(可以理解为“硬盘”)了。这样程序运行时就可以直接从本地取到机器码然后执行,大大提高了代码的执行效率。 在APK安装的时候就会做预先编译动作,编译好的文件是OAT文件,该文件本质上是一个ELF文件,这里与dex(Odex)文件最大的区别是OAT文件不再是字节码文件,而是一个可执行文件,可以更底层的与硬件接触,运行时也省去了预编译和转译的时间。
AOT作为默认的编译模式,也只是在android 5.x、6.x版本,7.0版本开始使用混合模式。AOT,是在应用安装时编译,优点是省去了在程序运行期间的编译时间,提高了代码的执行效率
AOT,也印在应用安装时编译,延长了应用的安装时间,增大了本地存储空间的占用
AOT作为默认编译模式,只存在于android 5.x、6.x版本
android 7.0及之后的编译模式是怎样的?
7.0版本采用的是hybird的模式,也就是JIT+AOT+解释器的结合。应用安装时不再编译,直接安装。代码执行时采用JIT的方式,对于热点trace和热点代码进行编译并产生profile文件,但这种JIT产生的编译不是持久化的。当手机进入空置或者充电状态时,系统隔一段时间就扫描一下app的profile文件,基于此profile文件制定的热点trace或者热点代码进行编译并进行持久化处理。待应用再次运行时,如本地有相关机器码,就直接运行本地的机器码而不再进行JIT编译。
此处的AOT,不再指“Ahead Of Time”,而是指“All Of the Time”。
这种混合模式的好处是,因为不再进行安装时编译,安装会变得很快;在空置或充电等状态下进行了编译,编译过的热点代码或热点trace不会再进行重复编译,执行效率也会提升。缺点是,应用前几次代码执行,效率可能一般;用户操作应用的次数越多,这种代码执行的效率越明显。
Dalvik
Dalvik使用JIT使用.dex字节码,是针对Android设备优化后的DVM所使用的运行时编译字节码
.odex是对dex的优化,deodex在系统第一次开机时会提取所有apk内的dex文件,odex优化将dex提前提取出,加快了开机的速度和程序运行的速度
ARTART 使用AOT
在安装apk时会进行预编译,生成OAT文件,仍以.odex保存,但是与Dalvik下不同,这个文件是可执行文件
dex、odex 均可通过dex2oat生成oat文件,以实现兼容性
在大型应用安装时需要更多时间和空间
android将引入aot编译器,JIT与AOT编译模式相关推荐
- weex android 滑动事件,【报Bug】weex编译模式下slider组件 @scroll 事件, 滑块左右滑动, @scroll 回调的值始终是负数, 判断不了左右动作...
详细问题描述 weex编译模式下slider组件 @change事件, 滑块左右滑动, @change回调的值始终是负数, 判断不了左右动作 weex官方文档 (DCloud产品不会有明显的bug,所 ...
- Angular 2 JIT vs AOT
转载于:https://segmentfault.com/a/1190000008739157 在 Angular 应用程序中,包含了我们通过 Angular 提供的 API 实现的自定义指令.这些自 ...
- android odex版本调试_android 基础-Dalvik ,ART,JIT,AOT,Dex,Odex
Dalvik 和 ART Dalvik:Dalvik 虚拟机,android 5.0 以前所使用的虚拟机,可执行文件为 dex 格式,基于寄存器的虚拟机(jvm 基于堆栈).通过 dx 工具将 .cl ...
- 对比JIT和AOT,各自的优点与缺点
编译器和解释器是什么 编译器和解释器的区别在于是否编译和执行过程是否是同时进行. 编译器所干的事,将一门语言 X 编译为另一门语言 Y (可以是语言 X.高级语言.低级语言等),整个编译过程涉及词法分 ...
- android将引入aot编译器,Android N混合使用AOT编译,解释和JIT三种运行时
Android N引入了我们一种主要包含编译.解释和JIT(Just In Time)的混合系统运行时,以便在安装工作时间.内存占用.电池材料消耗和性能指标之间可以获得发展最好的折衷. ART在And ...
- aot android,android – JIT与AOT编译
我不是完全家喻户晓的,如何在实践中 Android上的Dalvik JIT工作,因为JIT有几个选择可以如何工作. 第一个选择是,在应用程序启动时,JIT将所有字节码转换为CPU指令.此选项在应用程序 ...
- Android 系统(90)---JIT 编译器
实现 ART 即时 (JIT) 编译器 Android 运行时 (ART) 包含一个具备代码分析功能的即时 (JIT) 编译器,该编译器可以在 Android 应用运行时持续提高其性能.JIT 编译器 ...
- ART、JIT、AOT、Dalvik之间有什么关系?
2019独角兽企业重金招聘Python工程师标准>>> JIT与Dalvik JIT是"Just In Time Compiler"的缩写,就是"即时编 ...
- JIT VS AOT
一.AOT,JIT是什么 JIT,即Just-in-time,动态(即时)编译,边运行边编译:AOT,Ahead Of Time,指运行前编译,是两种程序的编译方式 理解 jit.aot 程序主要有两 ...
最新文章
- Vc2003可以直接跑quake3
- golang 数据类型 简介
- RDC TERM TABLE
- Python笔记——Django路由系统
- 深入理解数据结构和算法
- ctypes python_Python使用Ctypes与C/C++
- 前端学习(2672): vue3.0脚手架路由改变
- 多线程学习笔记(十二)
- mysql汉字转拼音首字母报错_MySQL 汉字转拼音
- 影响中国互联网的100人《世界商业评论》
- 用html做一个分类目录网站,分类目录网站做外链
- DevpTips【golang】安装到测试
- 导出富文本格式word
- speechbrain - 小记
- Unbound classpath container: ‘JRE System Library’已解决
- 史上最详细log4j使用文档
- R语言,来模拟LCT
- ios-block-对象与对象之间的解偶合
- 华为云GPU服务器部署PaddleOCR中英文识别服务
- c语言中字符 a b =,C语言中(ab)?a:b和(ab)?b:a有什么区别,C语言中,a++ +b和a+ ++b有什么不同...