2019独角兽企业重金招聘Python工程师标准>>>

JIT与Dalvik

JIT是”Just In Time Compiler”的缩写,就是”即时编译技术”,与Dalvik虚拟机相关。

怎么理解这句话呢?这要从Android的一些特性说起。

JIT是在2.2版本提出的,目的是为了提高Android的运行速度,一直存活到4.4版本,因为在4.4之后的ROM中,就不存在Dalvik虚拟机了。

我们使用Java开发android,在编译打包APK文件时,会经过以下流程

  • Java编译器将应用中所有Java文件编译为class文件
  • dx工具将应用编译输出的类文件转换为Dalvik字节码,即dex文件

之后经过签名、对齐等操作变为APK文件。

Dalvik虚拟机可以看做是一个Java VM,他负责解释dex文件为机器码,如果我们不做处理的话,每次执行代码,都需要Dalvik将dex代码翻译为微处理器指令,然后交给系统处理,这样效率不高。

为了解决这个问题,Google在2.2版本添加了JIT编译器,当App运行时,每当遇到一个新类,JIT编译器就会对这个类进行编译,经过编译后的代码,会被优化成相当精简的原生型指令码(即native code),这样在下次执行到相同逻辑的时候,速度就会更快。

当然使用JIT也不一定加快执行速度,如果大部分代码的执行次数很少,那么编译花费的时间不一定少于执行dex的时间。Google当然也知道这一点,所以JIT不对所有dex代码进行编译,而是只编译执行次数较多的dex为本地机器码。

有一点需要注意,那就是dex字节码翻译成本地机器码是发生在应用程序的运行过程中的,并且应用程序每一次重新运行的时候,都要做重做这个翻译工作,所以这个工作并不是一劳永逸,每次重新打开App,都需要JIT编译。

另外,Dalvik虚拟机从Android一出生一直活到4.4版本,而JIT在Android刚发布的时候并不存在,在2.2之后才被添加到Dalvik中。

ART与AOT

AOT是”Ahead Of Time”的缩写,指的就是ART(Anroid RunTime)这种运行方式。

前面介绍过,JIT是运行时编译,这样可以对执行次数频繁的dex代码进行编译和优化,减少以后使用时的翻译时间,虽然可以加快Dalvik运行速度,但是还是有弊病,那就是将dex翻译为本地机器码也要占用时间,所以Google在4.4之后推出了ART,用来替换Dalvik。

在4.4版本上,两种运行时环境共存,可以相互切换,但是在5.0+,Dalvik虚拟机则被彻底的丢弃,全部采用ART。

ART的策略与Dalvik不同,在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。之后打开App的时候,不需要额外的翻译工作,直接使用本地机器码运行,因此运行速度提高。

当然ART与Dalvik相比,还是有缺点的。

  • ART需要应用程序在安装时,就把程序代码转换成机器语言,所以这会消耗掉更多的存储空间,但消耗掉空间的增幅通常不会超过应用代码包大小的20%
  • 由于有了一个转码的过程,所以应用安装时间难免会延长
  • 但是这些与更流畅的Android体验相比而言,不值一提。

总结

通过前面背景知识的介绍,我终于可以更简单的介绍这四个名词之间的关系了:

  • JIT代表运行时编译策略,也可以理解成一种运行时编译器,是为了加快Dalvik虚拟机解释dex速度提出的一种技术方案,来缓存频繁使用的本地机器码
  • ART和Dalvik都算是一种Android运行时环境,或者叫做虚拟机,用来解释dex类型文件。但是ART是安装时解释,Dalvik是运行时解释
  • AOT可以理解为一种编译策略,即运行前编译,ART虚拟机的主要特征就是AOT

转载于:https://my.oschina.net/zzxzzg/blog/848629

ART、JIT、AOT、Dalvik之间有什么关系?相关推荐

  1. dvm与art的区别_Android运行时– DVM与ART,AOT与JIT

    dvm与art的区别 In this tutorial, we'll be discussing the runtime environments used in Android. We'll see ...

  2. Android .dex、.odex、Dalvik、ART、AOT、OAT

    文章来源:https://www.jianshu.com/p/e52b7e460748 https://zhuanlan.zhihu.com/p/53723652 目的 理清 .dex..odex.A ...

  3. 快速理清 .dex、.odex、ART、AOT、OAT 逻辑关系

    目的 理清 .dex..odex.ART.AOT.OAT 等近似名称的概念和意义. APK 生成 apk的打包过程 最终 apk 内的代码文件为 .dex 文件. APK 安装运行 基础概念 AOT: ...

  4. dalvik和鸿蒙,ART与Dalvik哪个好用 ART模式和Dalvik模式区别对比分析

    最新的安卓4.4系统中引入了全新的ART模式吗,相比之前流行已久的Dalvik模式有了很大的改变.最近看到不少安卓手机朋友在问ART与Dalvik哪个好这样的问题,因此笔者今天为大家制作了以下这张AR ...

  5. ART与Dalvik哪个好用 ART模式和Dalvik模式区别对比分析

    最新的安卓4.4系统中引入了全新的ART模式吗,相比之前流行已久的Dalvik模式有了很大的改变.最近看到不少安卓手机朋友在问ART与Dalvik哪个好这样的问题,因此笔者今天为大家制作了以下这张AR ...

  6. SAP库存表之间的逻辑关系

    SAP库存表之间的逻辑关系 转载于SAP学习门户网,原文链接: http://www.sap6.com/learn/mm/073504302015/3370.html 当前库存: 一般保存在 MARD ...

  7. 判断类之间的父子关系

    如何判断两个类之间的父子关系? java为我们提供了instanceof运算符,可以用来判断一个对象是否是否个类的实例,所以很容易的想到子类的对象肯定是父类的实例.但是如何所涉及到的类是不可实例化的该 ...

  8. 1. vi 与 vim 有什么区别呢,它们之间有什么关系?

    1. vi 与 vim 有什么区别呢,它们之间有什么关系? 答:简单的讲,vi编辑器是UNIX早期自带的文本编辑器,更能简单,不支持语法颜色:vim编辑器是在vi的基础上改进的版本,比vi功能更强大, ...

  9. R语言ggplot2可视化散点图、可视化两个数值变量之间的关系、使用geom_smooth函数基于loess方法拟合数据点之间的趋势关系曲线、自定义数据点的大小、色彩、添加主标题、副标题、题注信息

    R语言ggplot2可视化散点图.可视化两个数值变量之间的关系(Scatter plot).使用geom_smooth函数基于loess方法拟合数据点之间的趋势关系曲线.自定义数据点的大小.色彩.添加 ...

最新文章

  1. 网站页面相关性从五个方面进行判断
  2. 如何使用“Hash文件信息校验” 工具
  3. spring boot配置文件详解
  4. Python 学习笔记(2) - 基本概念、运算符与表达式
  5. 正确理解ContentPresenter
  6. DDD理论学习系列(4)-- 领域模型
  7. [Java基础]Random
  8. flowable BPMN的组件汉化
  9. 程序员7天长假出游指南
  10. typename的双重语义
  11. 双十一凌晨苹果发布会,新 Mac 有望搭载 ARM 架构自研芯片
  12. mysql表操作约束_MySQL操作表的约束
  13. 基于Matlab的随机信号分析
  14. javaScript中的垃圾回收机制
  15. thought work java,ThoughtWorks
  16. 医药、药品、医疗器械类网站备案需要什么材料?
  17. libcurl 使用说明和网页抓取 linux下的curl编程
  18. linux怎么编译ipa,如何使用XCode 4创建ipa文件及提交应用程序
  19. 能测试快充真假的软件,苹果iOS 12可自行测试真假快充:山寨充电器无处遁形
  20. 引起计算机故障的因素有哪些,电源故障引起的电脑问题有哪些

热门文章

  1. 获取本地IP和端口号的指令
  2. ECSHOP中添加自定义lbi文件
  3. 数据库安装时的log路径
  4. AndroidStudio_安卓原生开发_自定义蒙板弹出框WaitDialog---Android原生开发工作笔记134
  5. Vue事件处理_vue的事件处理超级方便_功能强大---vue工作笔记0011
  6. 基于Spring Security的认证授权_自定义登录页面_Spring Security OAuth2.0认证授权---springcloud工作笔记127
  7. 统计车牌识别里面各个lable 的数量
  8. lua编译器和ide
  9. Open vSwitch作为openflow交换机的启动方法
  10. eclise,myeclise,sts 打叉但是没提示解决办法