当前位置: 首页 > 面试题库 >

为什么使用JIT与编译机器码相比Java更快?

朱英范
2023-03-14
问题内容

我听说Java必须使用JIT来提高速度。与解释相比,这很合情合理,但是为什么有人不能制作可以生成快速Java代码的提前编译器呢?我知道gcj,但是我认为它的输出通常不会比Hotspot快。

语言方面是否存在使这变得困难的事情?我认为可以归结为以下几点:

  • 反射
  • 类加载

我想念什么?如果我避免使用这些功能,是否可以将Java代码一次编译为本机代码并完成?


问题答案:

任何AOT编译器的真正杀手是:

Class.forName(...)

这意味着您不能编写涵盖 所有
Java程序的AOT编译器,因为仅在运行时存在有关程序特性的信息。但是,您可以在Java的子集上执行此操作,这是我认为gcj所做的。

另一个典型的例子是,如果发现JIT可以安全地在调用方法中直接内联诸如getX()之类的方法,并且可以将其撤消,即使程序员没有明确帮助,也可以将其撤消方法是最终的。JIT可以看到在正在运行的程序中没有重写给定的方法,因此在这种情况下可以将其视为最终方法。在下一次调用中可能会有所不同。

编辑2019年:Oracle引入了GraalVM,它允许在Java的一个子集(相当大的一个,但仍然是一个子集)上进行AOT编译,其主要要求是所有代码都可以在编译时使用。这允许Web容器的毫秒启动时间。



 类似资料:
  • 问题内容: Sun的规范JVM实现对字节码进行了一些相当复杂的优化,以在代码运行几次后获得接近本机的执行速度。 问题是,为什么没有将此编译后的代码缓存到磁盘以供以后使用同一功能/类时使用? 就目前而言,每次执行程序时,JIT编译器都会重新启动,而不是使用代码的预编译版本。当本质上解释字节码时,是否添加此功能不会大大提高程序的初始运行时间? 问题答案: 我不求助于@MYYN发布的链接的’n’past

  • 问题内容: 我听说在某些情况下,由于JIT优化,Java程序或Java程序的某些部分比C ++(或其他预编译的代码)中的“相同”代码执行得更快。这是由于编译器能够确定某些变量的范围,避免某些条件并在运行时提取类似的技巧。 您能否举一个(或更佳的)例子,在哪里适用?也许概述了编译器能够优化字节码的确切条件,超出了预编译代码的范围? 注意: 此问题 不是 关于将Java与C ++进行比较。关于JIT编

  • 据我所知,JIT将字节码编译成运行速度更快的本机代码。因此,根据我的信念,我的问题的答案应该是1。翻译成机器代码2。解释字节码。因为解释代码意味着执行代码。但我发现答案恰恰相反!谁能解释一下。。。提前感谢

  • 问题内容: 有什么方法可以对Java即时编译器生成的本机代码进行汇编转储吗? 和一个相关的问题:是否有任何方法可以使用JIT编译器而无需运行JVM将我的代码编译为本地机器代码? 问题答案: 是的,有一种方法可以打印生成的本机代码(需要OpenJDK 7)。 不,无法使用JDK的JIT将Java字节码编译为本地代码并将其另存为本地可执行文件。 即使这是可能的,它也可能没有您想象的有用。JVM进行了一

  • 这个问题与android系统有关。Dalvik VM使用JIT概念,这意味着当您第一次运行应用程序时,Dalvik VM编译它并加载到RAM中,只要它能留在那里。我理解这个概念。而新的称为ART的虚拟机则使用AOT方法。ART编译应用程序后,你安装它(或当你正在安装它?)。这意味着什么?ART编译的应用程序与已编译的应用程序(如C应用程序)相同,但运行在与其他操作系统分离的独立进程中?谁能更透彻地

  • 问题内容: 我听说Java的优点是人们可以编写代码,为JVM编译代码,然后在任何地方运行它。每个人只需要为其平台使用JVM应用程序即可。 当然,它看起来类似于当前的情况,即每个人都有针对其平台的特定编译器。因此,优势并不能因此而得到解释。但是我想我明白了..问题一定是在Java情况下,您不能或不打算以特定于OS的方式直接访问真实机器。 我想这意味着在其他语言中,代码本身必须根据运行的计算机进行修改