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编译生成可执行文件保存到本地,待下次运行时直接使用,并且不断监视代码的更新,在代码有更新后重新生成可执行文件。

原文:https://www.cnblogs.com/linghu-java/p/10577515.html

Android里的Dalvik、ART、JIT、AOT有什么关系?的更多相关文章

  1. Android里的 ART、JIT、AOT、Dalvik之间有什么关系?

    ART.JIT.AOT.Dalvik之间有什么关系? JIT与Dalvik JIT是"Just In Time Compiler"的缩写,就是"即时编译技术", ...

  2. Android开发了解——Dalvik

    Dalvik是Google公司自己设计用于Android平台的Java虚拟机.Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一.它可以支持已转换为 .dex ...

  3. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

  4. Android里使用正則表達式

    在Android里怎样使用正則表達式: 以验证username为例.username一般字母开头,同意字母数字下划线.5-16个字节: String regEx = "^[a-zA-Z][a ...

  5. EF里一对一、一对多、多对多关系的配置和级联删除

    本章节开始了解EF的各种关系.如果你对EF里实体间的各种关系还不是很熟悉,可以看看我的思路,能帮你更快的理解. I.实体间一对一的关系 添加一个PersonPhoto类,表示用户照片类 /// < ...

  6. Android进阶笔记08:Android 中Activity、Window和View之间的关系

    1. Android 中Activity.Window和View之间的关系(比喻): Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图) LayoutI ...

  7. Android的.so文件、ABI和CPU的关系

    Android的.so文件.ABI和CPU的关系有篇文章描述的很详细了 见 http://blog.csdn.net/xx326664162/article/details/51163905

  8. Android高级之Dalvik初识

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 研究安卓已多年,一直在应用层做开发,Framework层只是看过,也就是大家常说的"底层& ...

  9. Android 里的数据储存

    数据持久化 关于数据储存,这个话题已经被反复讨论过很多次了,我是不建议把网络存储这种方式纳入到数据储存的范围的,因为这个和Android没多少关系,因此就有如下的分类: 本地储存(也称之为数据持久化, ...

随机推荐

  1. 以SQL命令方式调用存储过程

    string str = "Data Source=.;Initial Catalog=***;Integrated Security=True"; using (SqlConne ...

  2. Linux下打开超大文件的方法

    Linux下打开超大文件方法 在Linux下用VIM打开大小几个G.甚至几十个G的文件时,是非常慢的. 这时,我们可以利用下面的方法分割文件,然后再打开. 1 查看文件的前多少行 head -1000 ...

  3. Flutter UI系统

    我们可以看到,无论是Android SDK还是iOS的UIKit 的职责都是相同的,它们只是语言载体和底层的系统不同而已.那么可不可以实现这么一个UI系统:可以使用同一种编程语言开发,然后针对不同操作 ...

  4. Pytorch IO提速

    1. 把内存变成硬盘,把需要读的数据塞到里面去,加快了io. Optimizing PyTorch training code 如何给你PyTorch里的Dataloader打鸡血 轻轻松松为你的Li ...

  5. (转载) AutoML 与轻量模型大列表

    作者:guan-yuan 项目地址:awesome-AutoML-and-Lightweight-Models 博客地址:http://www.lib4dev.in/info/guan-yuan/aw ...

  6. Node.js+Express框架+Mongo学习(一)第一个node.js实例

    1.在桌面新建一个空的文件夹,比如叫node,当然也可以在其它地方新建. 2.命令行进入到所新建的文件夹的目录,下载Express框架,再在这个文件夹里新建一个叫final的项目 3.在项目(fina ...

  7. java常用JVM参数介绍

    采集服务JVM参数说明 -Xmx4g -Xms4g -Xmn512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=4g -Xss256k Xms 是指设定程 ...

  8. RedisTemplate通过scan方法进行自定义操作:1、根据hashKey的名称匹配相关hash键值对

    需求:有一个hash如下,现在想查询出stream前缀的键值对 操作方法如下: package com.example; import org.junit.Before; import org.jun ...

  9. js 类型判断

  10. [LeetCode] 242. Valid Anagram 验证变位词

    Given two strings s and t , write a function to determine if t is an anagram of s. Example 1: Input: ...