这个问题与android系统有关。 Dalvik VM 使用 JIT 概念,这意味着当您第一次运行应用程序 Dalvik VM 时会将其编译并加载到 RAM 只要它可以留在那里。我理解这个概念。但是名为 ART 的新虚拟机使用 AOT 方法。 ART 在安装后(或安装时)编译应用程序?这意味着什么?由 ART 编译的应用程序与已编译的应用程序(如C应用程序)相同,但是在与其他操作系统分开的单独进程中运行? 有人可以更彻底地向我解释这个概念。我必须做一些演示,这是在那里提到的,但我不明白这个概念,如果有人问我这个问题,我不想看起来很蠢:) 对不起英语不好,如果有人可以编辑一些问题会很好。
答案 0 :(得分:10)
我并不完全熟悉Android上的Dalvik JIT如何在实践中运作,因为JIT有多种选择如何工作。
第一个选项是,JIT在应用程序启动时将所有字节码转换为CPU指令。此选项在应用程序启动之前花了一些时间,之后该应用程序可以作为本机运行。问题是,翻译的应用程序必须在启动期间保留在内存中,这是不好的。
第二个选项是,JIT可以作为真正的Just-In-Time工作,这意味着在即将启动时转换代码块。整个应用程序在启动时不会被翻译,但只有主要功能在启动时被翻译,然后在运行期间被翻译,当使用某些代码块(功能等)时。此选项占用的内存较少,但在运行期间应用程序会慢得多。
根据我发现的信息,Android使用第一个选项。应用程序在发布时被翻译,之后它几乎“本地”运行。而这“几乎”在JIT和AOT之间产生了重大区别。
当您即将启动某个应用程序时,JIT只有有限的时间将所有字节码编译为CPU指令,以使启动延迟“可接受”很长。这意味着,它只能执行基本优化。但是,当您安装某个应用程序时,通常会有更多时间浪费,而且您只需要执行一次 - 而不是每次启动时都这样做。这意味着AOT编译器有更多的时间来找到如何优化该应用程序的技巧。结果代码应该更“有效”。第二个好处是,已编译的应用程序存储在缓存中,并且只有部分应用程序可以在启动时加载到内存中。这意味着操作系统没有将整个代码保存在内存中并且可以保存它。这是主要的区别。
你的问题的最后一部分--Android上的ART将在安装时执行编译(将apk保存到/ data / app /后)。但是,如果您擦除该缓存,或从Dalvik切换到ART,它将在首次启动时编译所有已安装的应用程序,这可能需要10分钟甚至更长时间。
抱歉我的英语不好,我是捷克人: - )