AOT,JIT是什么?

JIT,即Just-in-time,动态(即时)编译,边运行边编译;AOT,Ahead Of Time,指运行前编译,是两种程序的编译方式

区别

这两种编译方式的主要区别在于是否在“运行时”进行编译

优劣

JIT优点:

  1. 可以根据当前硬件情况实时编译生成最优机器指令(ps. AOT也可以做到,在用户使用是使用字节码根据机器情况在做一次编译)
  2. 可以根据当前程序的运行情况生成最优的机器指令序列
  3. 当程序需要支持动态链接时,只能使用JIT
  4. 可以根据进程中内存的实际情况调整代码,使内存能够更充分的利用

JIT缺点:

  1. 编译需要占用运行时资源,会导致进程卡顿
  2. 由于编译时间需要占用运行时间,对于某些代码的编译优化不能完全支持,需要在程序流畅和编译时间之间做权衡
  3. 在编译准备和识别频繁使用的方法需要占用时间,使得初始编译不能达到最高性能

AOT优点:

  1. 在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗
  2. 可以在程序运行初期就达到最高性能
  3. 可以显著的加快程序的启动

AOT缺点:

  1. 在程序运行前编译会使程序安装的时间增加
  2. 牺牲Java的一致性
  3. 将提前编译的内容保存会占用更多的外

与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区别,各自优劣,混合编译相关推荐

  1. Android N混合编译与对热补丁影响深度解析

    大约在六月底,Tinker在微信全量上线了一个补丁版本,随即华为反馈在Android N上微信无法启动.冷汗冒一地,Android N又搞了什么东东?为什么与instant run保持一致的补丁方式也 ...

  2. Android N混合编译与对热补丁影响解析

    首先非常抱歉Tinker没有按期内测,这主要因为开源的代码需要通过公司内部审核与评测,这项工作大约还需要一个月左右.当前Tinker已经在公司内部开源,我们会努力让它以更完善的姿态与大家见面. 大约在 ...

  3. Java在云原生的破局利器——AOT(JIT与AOT)

    导读 JIT(Just-in-Time,实时编译)一直是Java语言的灵魂特性之一,与之相对的AOT(Ahead-of-Time,预编译)方式,似乎长久以来和Java语言都没有什么太大的关系.但是近年 ...

  4. XCode下Object C和C++混合编译

    最近,在iOS上调试一个App,核心代码是用C++实现的,App界面使用Object C实现,在XCode下混合编译 C++/Object-C遇到的问题总结一下: 1. 文件格式问题,C++里的.h和 ...

  5. mysql timestamp json_mysql中timestamp,datetime,int类型的区别与优劣

    mysql中timestamp,datetime,int类型的区别与优劣 int 1. 占用4个字节 2. 建立索引之后,查询速度快 3. 条件范围搜索可以使用使用between 4. 不能使用mys ...

  6. 如何混合编译C语言和C++

    如何混合编译C语言和C++ 实际开发过程中,C++中会调用C与语言编写的代码,我在网络上面找到一篇写得很好的文章 http://blog.csdn.net/keensword/article/deta ...

  7. 华为鸿蒙OS发布!余承东:随时可替换安卓;方舟编译器将支持混合编译

    乾明 边策 郭一璞 发自 凹非寺  量子位 报道 | 公众号 QbitAI 千呼万唤始出来,华为鸿蒙操作系统,今日正式发布. 英文名HarmonyOS,寓意为和谐. 并不像亿万行代码的安卓那样笨重,鸿 ...

  8. makefile多目录的.c 格式.cpp混合编译

    原文地址:http://blog.csdn.net/yangbingzhou/article/details/50218315 [cpp] view plaincopyprint? # # c.cpp ...

  9. Linux下c和cuda混合编译,并生成动态链接库.so和使用

    Linux下c和cuda混合编译,并生成动态链接库.so和使用 2016-08-27 14:27 98人阅读 评论(0) 收藏 举报 分类: Linux 版权声明:本文为博主原创文章,未经博主允许不得 ...

最新文章

  1. python正则表达式模糊匹配_用python正则表达式编译模糊正则表达式
  2. 模型摆完pose怎么对称_糖分过浓警告!108个情侣写真pose,太好拍了!
  3. 十年前,他如何自学技术进阿里?
  4. Apache+Tomcat整合
  5. sas 文件传输 本地 服务器,SLIM SAS SFF-8654服务器转换线让传输更容易!
  6. php删除表中一行数据,mysql如何删除表中一行数据?
  7. python基础整数和浮点数(一)
  8. linkedin android,如何在android中登录linkedin?
  9. 路由交换实验一——CISCO路由器的基本配置
  10. 您已购买此 App 内购买项目。此项目将免费恢复。This In-App purchase has already been bought.It will be restored for free.
  11. echart获取geoJson格式世界各国地图的资源,世界地图,世界各国分区显示,精确到乡镇一级资源
  12. 年度读书总结:宏观经济学系列
  13. linux pthread_cleanup_push 线程实现,线程清理(pthread_cleanup_push函数和pthread_cleanup_pop函数)...
  14. 关于提取千位百位十位个位数字
  15. iOS开发学习笔记-C语言学习(一)
  16. 阿里云视频点播-对接注意点
  17. C语言学习(三)内存初识、数据在内存中的保存形式、程序载入内存
  18. jdk1.8的安装教程
  19. CSS3学习笔记-05-盒模型详解
  20. Eclipse中安装Java反编译插件JD-Eclipse

热门文章

  1. JAVA CAS原理深度分析
  2. 深富策略:冲高回落降准预期下A股将何去何从
  3. [软件工具]左键连发工具左键连点工具使用教程
  4. Android 投射工具和录屏工具
  5. linux C 二维数组 作为函数参数
  6. BeanCopier封装
  7. java //d+_Java语言程序设计D实验——类与对象实验
  8. MySQL修改表的列名
  9. HTML中的注释和常用特殊字符
  10. Html:正确给table表格加边框