当前位置: 首页 > 知识库问答 >
问题:

JIT与AOT编译

麻茂材
2023-03-14

这个问题与android系统有关。Dalvik VM使用JIT概念,这意味着当您第一次运行应用程序时,Dalvik VM编译它并加载到RAM中,只要它能留在那里。我理解这个概念。而新的称为ART的虚拟机则使用AOT方法。ART编译应用程序后,你安装它(或当你正在安装它?)。这意味着什么?ART编译的应用程序与已编译的应用程序(如C应用程序)相同,但运行在与其他操作系统分离的独立进程中?谁能更透彻地解释我这个概念。我必须做一些陈述,这是在这里提到的,但我不理解这个概念,如果有人问我这个问题,我不想显得哑巴:)对不起,英语不好,如果有人能修改一下问题就好了。

共有1个答案

花飞尘
2023-03-14

我并不完全熟悉Android上的Dalvik JIT在实践中是如何工作的,因为JIT有几个选项如何工作。

第一个选项是,JIT在应用程序启动时将所有字节码转换为CPU指令。此选项在应用程序启动之前花费了一些时间,然后该应用程序可以作为本机运行。问题是,翻译后的应用程序在启动时必须保存在内存中,这是不好的。

第二个选择是,JIT作为真正的实时工作,这意味着在即将启动时翻译代码块。整个应用程序不是在启动时翻译,而是在启动时只翻译主要函数,然后在运行时翻译,当使用某些代码块(函数等)时。此选项消耗的内存较少,但应用程序在运行过程中会慢得多。

根据我发现的信息,Android使用的是first选项。应用程序在启动时被翻译,然后它“几乎”原生地运行。这个“几乎”是JIT和AOT的主要区别。

当您将要启动某个应用程序时,JIT只有有限的时间将所有字节码编译为CPU指令,以使启动滞后时间“可接受”长。这意味着,它只能执行基本的优化。然而,当您安装一些应用程序,您通常有更多的时间浪费,您只做一次-不是每次启动。这意味着AOT编译器有更多的时间来寻找优化应用程序的技巧。得到的代码应该更“高效”。第二个好处是,编译后的应用程序存储在缓存中,在启动时只能将其一部分加载到内存中。这意味着操作系统没有将整个代码保存在内存中,可以将其保存起来。这就是主要的区别。

您问题的最后一部分--ART on Android将在安装时执行编译(将apk保存到/data/app/之后)。但是,如果您擦除缓存,或者从Dalvik切换到ART,它将在首次引导时编译所有已安装的应用程序,这可能需要10分钟甚至更多的时间。

 类似资料:
  • 一个程序的编译过程可以是步骤迭代式的,即每一轮步骤结束后得到的结果都可独立运行,比如,先构造AST再输出字节码,中间状态AST也是可以解释执行的。由于编译的本质就是代码转换,因此对一个语言可以有多个独立的编译器,每个负责一轮步骤 AOT Compiler和JIT Compiler就是针对编译形式做的分类: AOT:Ahead Of Time,指在运行前编译,比如普通的静态编译 JIT:Just

  • 我正在潜入angular 4,我试图理解编译。我已经读到,AOT和JIT都将TypeScript编译为JavaScript,无论是在服务器端还是在客户端。如果我在用Webpack和grunt构建它时编译它,并部署简化的javascript,那么AOT和JIT又是如何出现的呢?

  • 在Marshmallow中,有一个添加了ART的AOT编译器。在Androidn中,除了AOT之外,还添加了另一个编译器JIT。 AOT编译器的特定工作/特性是什么?areJIT编译器的工作/特性是什么?

  • 直接使用ngc 使用/webpack 我们推荐第二种方式,因为它最适合Angular + Webpack工具链。 首先,从npm获取/webpack并将其保存为开发依赖关系: import {AotPlugin} from '@ngtools/webpack' exports = { /* ... */ { test: /\.ts$/, loader:

  • 主要内容:JIT编译器语法,JIT编译器的风险和假设JIT 编译器是用 C++ 编写的,用于将 Java 转换为字节码。现在 Java 10 可以选择启用基于 Java 的实验性 JIT 编译器 Graal 来代替标准的 JIT 编译器。Graal 正在使用 Java 9 中引入的 JVMCI,即 JVM 编译器接口。 Graal 在 Java 9 中也可用。使用 Java 10,我们可以启用 Graal 来测试和调试实验性 JVM 编译器。 JI