AOT,JIT区别,各自优劣,混合编译
AOT,JIT是什么?
JIT,即Just-in-time,动态(即时)编译,边运行边编译;AOT,Ahead Of Time,指运行前编译,是两种程序的编译方式
区别
这两种编译方式的主要区别在于是否在“运行时”进行编译
优劣
JIT优点:
- 可以根据当前硬件情况实时编译生成最优机器指令(ps. AOT也可以做到,在用户使用是使用字节码根据机器情况在做一次编译)
- 可以根据当前程序的运行情况生成最优的机器指令序列
- 当程序需要支持动态链接时,只能使用JIT
- 可以根据进程中内存的实际情况调整代码,使内存能够更充分的利用
JIT缺点:
- 编译需要占用运行时资源,会导致进程卡顿
- 由于编译时间需要占用运行时间,对于某些代码的编译优化不能完全支持,需要在程序流畅和编译时间之间做权衡
- 在编译准备和识别频繁使用的方法需要占用时间,使得初始编译不能达到最高性能
AOT优点:
- 在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗
- 可以在程序运行初期就达到最高性能
- 可以显著的加快程序的启动
AOT缺点:
- 在程序运行前编译会使程序安装的时间增加
- 牺牲Java的一致性
- 将提前编译的内容保存会占用更多的外
与Android的关联
Android在2.2的时候引入JIT,在kitkat时新增了ART(Android RunTime),在Android L时使用ART完全替代了Dalvik作为默认的虚拟机环境。
Dalvik
- Dalvik使用JIT
- 使用.dex字节码,是针对Android设备优化后的DVM所使用的运行时编译字节码
- .odex是对dex的优化,deodex在系统第一次开机时会提取所有apk内的dex文件,odex优化将dex提前提取出,加快了开机的速度和程序运行的速度
ART
- ART 使用AOT
- 在安装apk时会进行预编译,生成OAT文件,仍以.odex保存,但是与Dalvik下不同,这个文件是可执行文件
- dex、odex 均可通过dex2oat生成oat文件,以实现兼容性
- 在大型应用安装时需要更多时间和空间
Android N引入的混合编译
在Android N中引入了一种新的编译模式,同时使用JIT和AOT。这是我在网上找到的一些解释:
包含了一个混合模式的运行时。应用在安装时不做编译,而是解释字节码,所以可以快速启动。ART中有一种新的、更快的解释器,通过一种新的JIT完成,但是这种JIT的信息不是持久化的。取而代之的是,代码在执行期间被分析,分析结果保存起来。然后,当设备空转和充电的时候,ART会执行针对“热代码”进行的基于分析的编译,其他代码不做编译。为了得到更优的代码,ART采用了几种技巧包括深度内联。
对同一个应用可以编译数次,或者找到变“热”的代码路径或者对已经编译的代码进行新的优化,这取决于分析器在随后的执行中的分析数据。
这些大概说的是新的ART在安装程序时使用JIT,在JIT编译了一些代码后将这些代码保存到本地,等到设备空闲的时候将保存的这些代码使用AOT编译生成可执行文件保存到本地,待下次运行时直接使用,并且不断监视代码的更新,在代码有更新后重新生成可执行文件。
AOT,JIT区别,各自优劣,混合编译相关推荐
- Android N混合编译与对热补丁影响深度解析
大约在六月底,Tinker在微信全量上线了一个补丁版本,随即华为反馈在Android N上微信无法启动.冷汗冒一地,Android N又搞了什么东东?为什么与instant run保持一致的补丁方式也 ...
- Android N混合编译与对热补丁影响解析
首先非常抱歉Tinker没有按期内测,这主要因为开源的代码需要通过公司内部审核与评测,这项工作大约还需要一个月左右.当前Tinker已经在公司内部开源,我们会努力让它以更完善的姿态与大家见面. 大约在 ...
- Java在云原生的破局利器——AOT(JIT与AOT)
导读 JIT(Just-in-Time,实时编译)一直是Java语言的灵魂特性之一,与之相对的AOT(Ahead-of-Time,预编译)方式,似乎长久以来和Java语言都没有什么太大的关系.但是近年 ...
- XCode下Object C和C++混合编译
最近,在iOS上调试一个App,核心代码是用C++实现的,App界面使用Object C实现,在XCode下混合编译 C++/Object-C遇到的问题总结一下: 1. 文件格式问题,C++里的.h和 ...
- mysql timestamp json_mysql中timestamp,datetime,int类型的区别与优劣
mysql中timestamp,datetime,int类型的区别与优劣 int 1. 占用4个字节 2. 建立索引之后,查询速度快 3. 条件范围搜索可以使用使用between 4. 不能使用mys ...
- 如何混合编译C语言和C++
如何混合编译C语言和C++ 实际开发过程中,C++中会调用C与语言编写的代码,我在网络上面找到一篇写得很好的文章 http://blog.csdn.net/keensword/article/deta ...
- 华为鸿蒙OS发布!余承东:随时可替换安卓;方舟编译器将支持混合编译
乾明 边策 郭一璞 发自 凹非寺 量子位 报道 | 公众号 QbitAI 千呼万唤始出来,华为鸿蒙操作系统,今日正式发布. 英文名HarmonyOS,寓意为和谐. 并不像亿万行代码的安卓那样笨重,鸿 ...
- makefile多目录的.c 格式.cpp混合编译
原文地址:http://blog.csdn.net/yangbingzhou/article/details/50218315 [cpp] view plaincopyprint? # # c.cpp ...
- Linux下c和cuda混合编译,并生成动态链接库.so和使用
Linux下c和cuda混合编译,并生成动态链接库.so和使用 2016-08-27 14:27 98人阅读 评论(0) 收藏 举报 分类: Linux 版权声明:本文为博主原创文章,未经博主允许不得 ...
最新文章
- python正则表达式模糊匹配_用python正则表达式编译模糊正则表达式
- 模型摆完pose怎么对称_糖分过浓警告!108个情侣写真pose,太好拍了!
- 十年前,他如何自学技术进阿里?
- Apache+Tomcat整合
- sas 文件传输 本地 服务器,SLIM SAS SFF-8654服务器转换线让传输更容易!
- php删除表中一行数据,mysql如何删除表中一行数据?
- python基础整数和浮点数(一)
- linkedin android,如何在android中登录linkedin?
- 路由交换实验一——CISCO路由器的基本配置
- 您已购买此 App 内购买项目。此项目将免费恢复。This In-App purchase has already been bought.It will be restored for free.
- echart获取geoJson格式世界各国地图的资源,世界地图,世界各国分区显示,精确到乡镇一级资源
- 年度读书总结:宏观经济学系列
- linux pthread_cleanup_push 线程实现,线程清理(pthread_cleanup_push函数和pthread_cleanup_pop函数)...
- 关于提取千位百位十位个位数字
- iOS开发学习笔记-C语言学习(一)
- 阿里云视频点播-对接注意点
- C语言学习(三)内存初识、数据在内存中的保存形式、程序载入内存
- jdk1.8的安装教程
- CSS3学习笔记-05-盒模型详解
- Eclipse中安装Java反编译插件JD-Eclipse