在棉花糖中有一个添加了ART的AOT编译器。在Android N中,除了AOT之外,还添加了另一个编译器JIT。
什么是AOT编译器特定的作业/功能? areJIT编译器作业/功能是什么?
发布于 2017-12-04 12:52:40
在Android中,Java类转换为DEX字节码。DEX字节码格式通过ART或Dalvik运行时转换为本机代码。
Dalvik是一个基于即时编译的引擎。使用Dalvik有一些缺点,因此从Android4.4 (kitkat)开始,ART作为运行时引入,而从Android5.0(棒棒糖)开始,它已经完全取代了Dalvik。Android 7.0在Android运行时(ART)中添加了一个带有代码分析的即时(JIT)编译器,可以在Android应用运行时不断提高它们的性能。
(Dalvik使用JIT (即时)编译,而ART使用AOT (提前)编译。)
准时化(JIT):
使用Dalvik JIT编译器,每次应用程序运行时,它都会将Dalvik字节码的一部分动态转换为机器码。随着执行的进行,更多的字节码被编译和缓存。由于JIT只编译部分代码,因此它具有较小的内存占用,并且在设备上使用较少的物理空间。
Ahead (AOT):
ART配备了一个先进的编译器。在应用程序的安装阶段,它会静态地将DEX字节码转换为机器代码并存储在设备的存储空间中。这是在设备上安装应用程序时发生的一次性事件。
Android N包含一个混合运行时:
在安装过程中不会进行任何编译,并且可以立即启动应用程序,解释字节码。ART中有一个新的、更快的解释器,它伴随着一个新的JIT,但JIT信息不是持久的。取而代之的是,在执行期间对代码进行概要分析,并保存结果数据。
ART的好处:
在应用程序的installation.
ART的缺点:
由于在installation.
发布于 2016-10-31 13:49:13
编译器需要两样东西来生成高性能的代码:信息和资源。
JIT编译器拥有比AOT编译器多得多的信息。静态分析在一般情况下是不可能的(几乎所有你想知道的关于程序的有趣的事情都可以归结为停顿问题或莱斯定理),即使在特殊情况下也很难。JIT编译器没有这个问题:他们不必静态地分析程序,他们可以在运行时动态观察它。
此外,JIT编译器拥有AOT编译器所没有的技术,其中最重要的一项是反优化。现在,你可能会想,我们取消优化对性能很重要吗?嗯,如果你可以反优化,那么你可能在进行实际上无效的优化时过于激进(比如内联可能是多态的方法调用,也可能不是多态的方法调用),如果事实证明你错了,那么你可以反优化回未内联的情况(例如)。
然而,有一个资源的问题: AOT编译器可以花费它想要的时间,并使用它想要的内存。JIT编译器必须从用户现在想要使用的程序中窃取资源。
通常,这不是问题。我们今天的机器是如此荒唐地被压倒,以至于JIT总是有足够的资源可供支配。特别是因为当一次将大量新代码引入系统时,JIT将使用最多的资源,这通常是在程序启动期间,或者当程序在阶段之间转换时(例如,从解析配置文件到建立对象图,或者从完成配置到开始实际工作),此时程序本身通常还没有使用那么多的资源(特别是在程序启动期间)。Azul JCA就是一个很好的例子。它最大的配置有864个内核和768个GiByte内存(请注意,它们已经有很长一段时间没有销售了,所以这实际上是几年前的技术)。根据Azul的测量,当JIT非常努力地工作时,它可能会使用50个核心。这仍然是程序、系统和GC剩余的800多个内核。
但是一个典型的安卓设备没有1000个内核和一个TiByte内存。而且它具有极强的交互性和延迟敏感度,当用户启动WhatsApp时,他想立即写一条消息。不是在500毫秒内,当JIT预热的时候。现在。
这就是为什么AOT在这里很有吸引力。还要注意的是,JIT编译不仅会从正在运行的程序中窃取资源,还需要电池供电,而且每次程序运行时都需要电池供电,而AOT编译器只需要在安装应用程序时花费一次电力预算。
你可以走得更远,把编译工作推给应用商店,甚至交给开发人员,就像苹果一样,但苹果的优势是,可供考虑的可能目标平台的数量要有限得多,所以对于Android来说,在设备上进行AOT编译似乎是一种合理的权衡。
发布于 2020-12-22 19:48:02
JIT vs AOT
.java -> .class -> .dex(by DX, D8) -> machine byte codeJust In Time(JIT) -Dalvic(基于寄存器)-在执行前生成机器字节码。它占用的内存较少,但CPU使用率(Lags)、周期、电池寿命较长
Ahead Of Time(AOT) - Android Runtime(ART) -在安装过程中生成机器字节码。是在API 19中引入的,并成为API 21中的默认值。main它有更大的首次发射。ART优化的内存分配和垃圾回收器(GC)-仅迭代一次
来自API24ART使用与AOT和JIT [ClassLoader]的混合方法。
https://stackoverflow.com/questions/40336455
复制相似问题