ART中AOT和JIT编译器的区别

     2023-02-23     78

关键词:

【中文标题】ART中AOT和JIT编译器的区别【英文标题】:Difference between AOT and JIT compiler in the ART 【发布时间】:2017-03-13 04:45:28 【问题描述】:

在 Marshmallow 中添加了一个带有 ART 的 AOT 编译器。从 Android N 开始,除了 AOT 之外,还添加了另一个编译器 JIT。

什么是 AOT 编译器特定的作业/功能,什么是 JIT 编译器的作业/功能?

【问题讨论】:

【参考方案1】:

编译器需要两件事来生成高性能代码:信息和资源。

JIT 编译器比 AOT 编译器拥有更多的信息。静态分析在一般情况下是不可能的(您想了解的有关程序的几乎所有有趣的事情都可以简化为停机问题或莱斯定理),即使在特殊情况下也很难。 JIT 编译器没有这个问题:他们不必静态分析程序,可以在运行时动态观察。

另外,JIT 编译器拥有 AOT 编译器所没有的技术,其中最重要的一项是去优化。现在,您可能会想,我们去优化对性能很重要吗?好吧,如果您可以取消优化,那么您可能会过于激进地进行实际上无效的优化(例如内联可能是或可能不是多态的方法调用),如果事实证明您错了,您可以然后反优化回到未内联的情况(例如)。

但是,存在资源问题:AOT 编译器可以根据需要花费尽可能多的时间,并且可以使用尽可能多的内存。 JIT 编译器必须从用户现在想要使用的程序中窃取其资源。

通常,这不是问题。我们今天的机器功能如此强大,以至于 JIT 总是有足够的资源可供使用。尤其是当一次将大量新代码引入系统时,JIT 将使用最多的资源,这通常是在程序启动期间,或者程序在各个阶段之间转换时(例如,从解析配置文件到设置对象图,或者从完成配置到开始实际工作),此时程序本身通常还没有使用那么多资源(尤其是在程序启动期间)。 Azul JCA 就是一个很好的例子。它的最大配置有 864 个内核和 768 GiByte RAM(请注意,它们已经有一段时间没有出售了,所以这实际上是几年前的技术)。根据 Azul 的测量,当 JIT 非常努力工作时,它可能使用 50 个内核。这仍然是为程序、系统和 GC 剩余的 800 多个内核。

但您的典型 Android 设备没有 1000 个内核和一个 TiByte 的 RAM。而且它非常具有交互性和对延迟敏感,当用户启动 WhatsApp 时,他想立即写一条消息。不是在 500 毫秒内,当 JIT 预热时。现在。

这就是 AOT 的吸引力所在。另请注意,JIT 编译不仅会从正在运行的程序中窃取资源,它还需要电池电量,并且每次程序运行时都需要电池电量,而 AOT 编译器只需花费一次电量预算,当应用已安装。

您可以走得更远,将编译推送到应用商店甚至开发人员,就像 Apple 所做的那样,但 Apple 的优势在于要考虑的可能目标平台集要有限得多,因此在设备上AOT 编译对于 Android 来说似乎是一个合理的折衷方案。

【讨论】:

你知道的好答案,但是太长了。 很好的答案。甚至可以更长,我仍然想读它。我问自己,JIT 可用的额外信息是否真的能带来很大的性能提升。 @farhan 为什么android在构建apk的时候不直接编译.oat或者native binaries,这样安装后就不需要编译了?【参考方案2】:

在 Android 中将 Java 类转换为 DEX 字节码。 DEX 字节码格式通过 ART 或 Dalvik 运行时转换为本地机器码。

Dalvik 是一个基于 JIT(即时)编译的引擎。有 因此从 Android 4.4 (kitkat) ART 使用 Dalvik 的缺点是 作为运行时引入,它从 Android 5.0 (Lollipop) 开始 完全取代了达尔维克。 Android 7.0 增加了即时 (JIT) 带有代码分析到 Android 运行时 (ART) 的编译器 提高 Android 应用在运行时的性能。

Dalvik 使用 JIT(即时)编译,而 ART 使用 AOT(提前)编译。

准时 (JIT):

使用 Dalvik JIT 编译器,每次运行应用程序时,它都会将 Dalvik 字节码的一部分动态转换为机器码。随着执行的进行,更多的字节码被编译和缓存。由于 JIT 只编译部分代码,因此它占用的内存更小,占用的设备物理空间也更少。

提前 (AOT):

ART 配备了 Ahead-of-Time 编译器。在应用程序的安装阶段,它将 DEX 字节码静态转换为机器码并存储在设备的存储中。这是在设备上安装应用时发生的一次性事件。

Android N 包含一个混合运行时:

安装过程中不会进行任何编译,可以立即启动应用程序, 被解释的字节码。 ART 中有一个新的、更快的解释器,它伴随着一个新的 JIT,但 JIT 信息不会持久化。 相反,代码在执行期间被分析并保存结果数据。

艺术的好处:

在安装过程中完成 DEX 字节码转换后,应用程序运行速度更快。 在直接执行本机代码时减少应用程序的启动时间。 提高了电池性能,因为节省了用于逐行解释字节码的电量。 改进的垃圾收集器。

ART 的缺点:

由于在安装过程中将 DEX 字节码转换为机器码,App 安装需要更多时间。

由于安装时生成的本机机器代码存储在内部存储中,因此需要更多的内部存储。

【讨论】:

【参考方案3】:

JIT 与 AOT

.java -> .class -> .dex(by DX, D8) -> machine byte code

Just In Time(JIT) - Dalvic(基于寄存器) - 在执行前生成机器字节码。它具有更少的内存占用,但具有更大的 CPU 使用率(滞后)、周期性、电池寿命

Ahead Of Time(AOT) - Android Runtime(ART) - 在安装期间生成机器字节码。在 API 19 中引入并在 API 21 中成为默认值。 main 它具有更大的首次启动。 ART 优化内存分配和垃圾收集器 (GC) - 仅一次迭代

从 API 24 开始,ART 使用 AOT 和 JIT 的混合方法 [ClassLoader]

【讨论】:

成为 API 21 中的 default 你是说?

aot和jitil2cpp和monoclrilruntime热更新原理(代码片段)

AOT和JIT字面意思:JIT:JustInTimeAOT:AheadofTime区别:主要区别在于是否在“运行时”进行编译.优劣:AOT优点:1.在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗.2.可以在程序运行初期就达到最高性能.3.... 查看详情

同一项目上的角度 AOT 和 JIT

...r5上,我尝试对我的大部分模块/组件进行同一个项目的AOT编译...但我有一部分需要JIT编译。对于第二部分,HTML来自Ajax请求并包含一些必须由angular编译的组件标记。为了管理这部分,我使用如下指令:exportclassArticleLiveD 查看详情

art和dalvik的比较

...   ART有相较于Dalvik有两大特色: (1)超前编译(AOT:Ahead-of-Time),主要用于提升速度和减少内存(没有JIT,当然会减少相应的内存开销)。 (2)提升了垃圾回收性能。     A... 查看详情

dart的特性(jit与aot、内存分配与垃圾回收、单线程模型)

参考技术A借助于先进的工具链和编译器,Dart是少数同时支持JIT(JustInTime,即时编译)和AOT(AheadofTime,运行前编译)的语言之一。JIT和AOT是最常见的两种编译模式。Dart是单线程模型,Dart中并没有多线程概念,只有Isolate(隔离区)。Isol... 查看详情

安卓art虚拟机在啥位置

...机是一个解释执行器。Android2.2,Android虚拟机中加入了JIT编译器(Just-In-TimeCompiler)。Android4.4,全新的ART虚拟机运行环境诞生,此时ART和Dalvik是共存的,用户可以在两者之间进行选择。Android5.0,ART全面取代了Dalvik成为了Android虚... 查看详情

如何使用 monotouch 编译库(出现错误:尝试使用 --aot-only 进行 JIT 编译)

】如何使用monotouch编译库(出现错误:尝试使用--aot-only进行JIT编译)【英文标题】:Howtocompilelibrarieswithmonotouch(gettingerror:attemptingtoJIT-compilewith--aot-only)【发布时间】:2011-03-1310:11:50【问题描述】:我正在尝试在单点触控项目中使... 查看详情

flutter在debug和release下分别使用啥编译模式,有啥区别?

参考技术ADebug模式下使用JIT编译模式,即Justintime(即时编译),Release下使用AOT模式,即Aheadoftime(提前编译)。JIT模式因为需要边运行边编译,所以会占用运行时内存,导致卡顿现象,但是有动态编译效果对于开发者来说非常方便调... 查看详情

(Xamarin iOS):ExecutionEngineException - 在仅 aot 模式下运行时尝试 JIT 编译方法

...XamariniOS):ExecutionEngineException-在仅aot模式下运行时尝试JIT编译方法【英文标题】:(XamariniOS):ExecutionEngineException-AttemptingtoJITcompilemethodwhilerunninginaot-onlymode【发布时间】:2017-06-0214:13:38【问题描述】:在设备上以发布模式运行应用... 查看详情

❤️androidruntime(art)和dalvik❤️

目录1.Dalvik1.1Dalvik和JVM区别1.2Dalvik如何运行java1.3dex文件2.AndroidRuntime(ART)2.1ART功能2.1.1预先(AOT)编译2.1.2垃圾回收方面的优化2.1.3开发和调试方面的优化2.2Android8.0中的ART功能改进2.2.1并发压缩式垃圾回收器2.2.2循环优化2.2.3类层次结构... 查看详情

深入理解dalvik虚拟机-解释器的执行机制

...运行是解释器+JIT的方式,解释器就是虚拟机来对Javac编译出来的字节码,做译码、运行,而不是转化成CPU的指令集。由CPU来做译码,运行。可想而知。解释器的效率是相对较低的,所以出现了JIT(JustInTime),JIT是将运行次数较... 查看详情

java平台的理解

一:java不仅仅是解释执行(java编译成字节码,在转换成机器码),还有动态编译,在程序运行时,利用jit编译将热点代码编译成机器码,这时候就是编译执行,不是解释执行二: 三:jdk8是解释和编译混合模式,也有server和... 查看详情

语言特性

...码文件,再被jvm解释器解释执行JIT,justintimecompile,即时编译器,将频繁执行的代码(热点代码)直接编译成本地机器码AOT,jdk9引入AOT特性,直接将字节码编译成机器码,避免了JIT预热等开销jdk、jrejre,javaruntimeenviroment,包括jvm... 查看详情

.net7的aot原理简析

...这两个东西来的,编译目标文件Obj用的是微软的官方编译器IlCompiler它 查看详情

[转帖]软件的变革与aot(代码片段)

...能够被处理器直接执行,编程语言基本上都是人类可读,编译器或者解释器就需要将源代码转变为CPU可以操作的指令。比如一个加法函数最终需要执行addl汇编指令对应 查看详情

在 Angular 5 和 AOT-Build 中使用 @angular 编译器时出错

】在Angular5和AOT-Build中使用@angular编译器时出错【英文标题】:Errorwhileusing@angularcompilerinAngular5andAOT-Build【发布时间】:2018-06-2814:24:43【问题描述】:我正在使用Angular编译器在运行时编译组件。此代码工作正常,但如果我想使用AO... 查看详情

如何在 C# 中检查代码是不是在 AOT 中运行?

...【发布时间】:2021-03-1509:52:07【问题描述】:我正在使用编译表达式来创建实例。由于回退过程,它在JIT中非常快,但在AOT中却不是(甚至更慢)。所以我想检查代码是否在AOT中运行。如果是,我会改用ConstructorInfo.Invoke。ATM,... 查看详情

RyuJIT 和 Roslyn 有啥区别?

...6-07-1223:51:51【问题描述】:我知道RyuJIT是一个比JIT更快的编译器。但它是.NET4.6的新标准还是Roslyn?还是在编译过程中需要暴露API的时候使用Roslyn?我对它们的用途以及它们将在哪些框架中找到它们感到困惑。 查看详情

仅在模式 (JIT) 和 POSTCSS 设置无法在 Gatsby 中编译

】仅在模式(JIT)和POSTCSS设置无法在Gatsby中编译【英文标题】:Justinmode(JIT)andPOSTCSSsetupnotcompileinGatsby【发布时间】:2022-01-1419:30:45【问题描述】:我也想在我的顺风中使用时间模式,用postcss设置gatsby。当我运行gatsbydevelop时,它会... 查看详情