JIT编译器做什么?

时间:2010-05-25 08:34:58

标签: compiler-construction jit

我只是在观看Google IO视频,他们谈到了他们在Android中包含的JIT编译器。由于JIT编译器,他们展示了性能改进的演示。我想知道JIT编译器究竟做了什么,并希望从不同的人那里听到。

那么,JIT编译器的职责是什么?

9 个答案:

答案 0 :(得分:32)

Java代码通常以字节码的形式分发,这是与机器无关的伪代码。 (以前在70年代开发的 UCSD-p系统中使用了相同的想法。)这样做的好处是可以在不同的处理器和操作系统中运行相同的应用程序。此外,字节码通常小于编译应用程序。

与运行编译代码相比,缺点是解释代码。 为了解决这个问题,开发了 JIT编译器。 JIT编译器在代码执行之前将代码编译为机器代码。与解释器相比,这加快了执行速度,但每次运行程序时都会花费额外的时间进行编译。 另外,由于JIT编译器必须快速编译,因此不能使用静态编译器中使用的复杂优化技术。

另一种方法是 HotSpot 编译。它最初作为解释器运行,但随后检测最常使用的例程并仅编译那些例程。优点是由于编译没有初始延迟。此外,HotSpot编译器可以在执行期间进行分析,然后为最重要的例程发出更强的优化。它甚至可能收集信息,以便当您一次又一次地运行相同的应用程序时,它将运行得越来越快。有关HotSpot编译的更多信息,请参阅this article(tnx Pangea链接)。

当然,您可以使用静态编译器来编译机器的字节码,而不是使用JIT编译器。这允许完全优化,然后每次运行应用程序时都不需要再次编译。但是,在手机和网页中,您通常只执行一次代码(或applet),因此JIT编译器可能是更好的选择。

<强>更新

Python字节码文件的扩展名为.py。当您执行字节码文件时,Python JIT编译器会生成编译文件.pyc。下次运行相同的程序时,如果.py文件没有更改,则无需再次编译,而是Python运行以前编译的.pyc文件。这加快了程序的开始。

答案 1 :(得分:14)

JIT是“及时”的缩写。 JIT编译器将代码(通常是Java字节码或Microsoft IL等中间语言)编译为本机可执行代码,并且在调用代码时执行此操作。因此,在调用代码之前,它仅存在于可移植的,非机器特定的字节码或IL中,然后在调用时,生成本机代码(然后在后续调用中重复使用)。

答案 2 :(得分:7)

它是一个即时编译器,位于解释器和编译器之间(即它编译,但仅在代码执行之前)。

这允许使用仅在运行时已知的动态信息来优化编译(因为编译器通常静态运行,因此只能访问编译时信息)。它们写起来要困难得多,但可以带来很好的性能提升。

有关详情,请一如既往地see Wikipedia

  

在计算中,即时编译(JIT),也称为动态转换,是一种用于改善计算机程序的运行时性能的技术。传统上,计算机程序有两种运行时操作模式,可以是解释的,也可以是静态的(提前)编译。解释的代码在每次执行期间不断地从高级语言翻译成机器代码,而静态编译在执行之前将代码翻译成机器代码,并且只需要翻译一次。

     

JIT编译器代表了一种混合方法,翻译不断发生,与解释器一样,但通过缓存已翻译的代码来最大限度地降低性能下降。它还在开发时提供了超过静态编译代码的其他优势,例如处理后期绑定数据类型以及强制执行安全保证的能力。

答案 3 :(得分:3)

JIT =及时。这是一个过程,在这个过程中,一个可以解释的程序(例如Java字节码或Javascript代码)会在运行时动态转换为本机机器代码,以提高性能。

一些好处是JIT编译器可以看到热点并应用更积极的优化,它还可以利用当前处理器与SSE2类似的任何扩展。

这个问题可能有更多信息: How a JIT compiler helps performance of applications?

答案 4 :(得分:2)

  

那么,JIT的职责是什么   编译器?

正如其他人所说,它是“及时”的缩写,在这个意义上意味着“及时执行”。

当您将程序编译为机器代码时,它们通常针对某个平台。

因此 JIT 是“发明的”,你想为执行平台编译代码的最后一些部分,所以把它看成是“之前的执行” - 编译器/优化器。

JIT 让我们的生活变得更轻松,并且(希望)我们的应用程序运行得更快。

当然还有其他purposes of JIT-compilation,上面只是其中之一。

答案 5 :(得分:2)

非常好的解释:

&#34;实际上,方法在第一次调用时不会被编译。对于每个方法,JVM都维护一个调用计数,每次调用该方法时都会递增。 JVM解释方法,直到其调用计数超过JIT编译阈值。因此,经常使用的方法是在JVM启动后很快编译的,而较少使用的方法会在很晚之后编译,或者根本不编译。 JIT编译阈值有助于JVM快速启动并且仍然具有改进的性能。已经仔细选择阈值以在启动时间和长期性能之间获得最佳平衡。

编译方法后,其调用计数重置为零,随后对该方法的调用继续增加其计数。当方法的调用计数达到JIT重新编译阈值时,JIT编译器第二次编译它,应用比先前编译更多的优化选择。重复此过程,直到达到最大优化级别。 Java程序中最繁忙的方法总是最积极地进行优化,最大限度地提高了使用JIT编译器的性能优势。 JIT编译器还可以在运行时测量操作数据,并使用该数据来提高质量进一步的重新编译。

可以禁用JIT编译器,在这种情况下将解释整个Java程序。除了诊断或解决JIT编译问题外,不建议禁用JIT编译器。&#34;

来源:https://www-01.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/com.ibm.java.aix.71.doc/diag/understanding/jit_overview.html

答案 6 :(得分:1)

JIT编译器通常是VM管道的最后一部分,并从VM的中间语言生成机器代码。

它通过优化运行环境的生成代码来提高速度(CPU特定指令,缓存大小......)。

传统编译器还优化生成的机器代码,但他们必须在不了解运行时可用的特定资源的情况下执行此操作。

答案 7 :(得分:1)

Just-In-Time(JIT)编译器是Java™运行时环境的一个组件,可在运行时提高Java应用程序的性能。

请参阅IBM文档here

解释器基本上是这样做的:

  1. 读取下一个要执行的字节码
  2. 查看字节码是什么,并找到与其对应的本地机器指令
  3. 执行本机指令
  4. 转到第1步
  5. 这很简单,它运行良好,它将运行您的Java程序。但它也效率低下,因为查找要执行的每个字节码的本机指令会花费处理时间。所以JVM包含第二种机制,Just-In-Time编译器,它基本上是这样做的:

    1. 读取需要执行的方法的所有字节码
    2. 将所有这些字节码转换为本地机器指令
    3. 执行生成的本机说明
    4. 在将方法的字节码转换为本机机器指令之后,JVM会记住该本机代码,以便下次必须运行该方法时,它可以简单地运行本机指令 - 它不需要每次运行方法时转换字节码。这使程序运行得更快。

      此外,JIT执行大量优化以生成尽可能快地运行的本机代码。

答案 8 :(得分:0)

疑 先生,如果javac是一个Java编译器,它的作用是将源代码转换为字节代码意味着.Class然后.class(字节代码)由Java解释器(Java)解释意味着JVM和JIT是JVM的一部分那么它是什么实际工作