ART中AOT和JIT编译器的区别

时间:2016-10-31 04:07:32

标签: android android-6.0-marshmallow jit android-7.0-nougat

在Marshmallow,有一个AOT编译器添加了ART。从Android N到AOT还添加了另一个编译器JIT。

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

3 个答案:

答案 0 :(得分:6)

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

  

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

Dalvik使用JIT(及时)编译,而ART使用AOT(Ahead of time)编译。

及时(JIT):

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

提前(AOT):

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

Android N包含混合运行时:

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

ART的好处:

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

ART的缺点:

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

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

答案 1 :(得分:4)

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

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

另外,JIT编译器有一些技术可供AOT编译器使用,最重要的是去优化。现在,您可能会认为,我们对性能的重新优化非常重要吗?好吧,如果你可以去优化,那么你可以过度积极地进行实际上无效的优化(比如内联一个可能是也可能不是多态的方法调用),如果结果证明你错了,你可以然后去优化回非内联案例(例如)。

然而,存在资源问题:AOT编译器可以花费尽可能多的时间,并使用尽可能多的内存。 JIT编译器必须从目前用户想要使用的程序中窃取其资源。

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

但是你的典型Android设备没有1000个内核和一个内存的TiByte。并且它具有极强的交互性和延迟敏感性,当用户启动时,比如WhatsApp,他现在想写一条消息。当JIT已经预热时,不是500毫秒。 NOW。

这就是让AOT吸引人的原因。另请注意,JIT编译不仅会从正在运行的程序中窃取资源,还需要电池供电,每次程序运行时都需要它,而AOT编译器只需要花费一次功率预算, app已安装。

你可能会更加极端,并将编辑推送到应用程序商店甚至开发人员,就像Apple一样,但Apple的优势在于可以考虑更多有限的可能目标平台,因此在设备上AOT编译似乎是Android的合理权衡。

答案 2 :(得分:1)

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]