即时编译器(JIT)是什么?

635

相对于非JIT编译器,JIT编译器具体做什么? 能否简洁易懂地描述一下?

JIT编译器会在程序运行时动态编译字节码为本机代码,从而提高程序的执行效率。而非JIT编译器则会在程序启动时将整个程序的字节码编译为本机代码,这可能会导致启动时间延长。

1
http://www.ibm.com/support/knowledgecenter/SSYKE2_7.1.0/com.ibm.java.aix.71.doc/diag/understanding/jit_overview.html - TechDog
2
更新链接 - Akash Narayan
2
我发现https://www.youtube.com/watch?v=yQ27DjKnxwo很有用。 - Adam Zerner
18个回答

4

您的代码被编译成一些IL(中间语言)。当您运行程序时,计算机无法理解这段代码。它只能理解本地代码。因此,JIT编译器会即时将您的IL编译成本地代码。它是在方法级别上完成的。


4
你的意思是什么“方法级别”? - Koray Tugay
这不正确,它是由解释器运行的,在编译阈值达到相关方法后,JIT才会启动。 - Diego Ramos

2
即时编译(JIT)编译,也叫动态转换或运行时编译,是一种执行计算机代码的方式,它涉及在程序运行时进行编译,而不是在执行之前。 JIT 编译是传统的两种将代码翻译成机器代码的方法 - 预先编译(AOT)和解释 - 的结合,并结合了这两种方法的一些优点和缺点。 JIT 编译结合了编译代码的速度和解释的灵活性。让我们以 JVM 中使用 JIT 为例。例如,HotSpot JVM JIT 编译器生成动态优化。换句话说,它们在 Java 应用程序运行时做出优化决策,并生成针对底层系统架构的高性能本地机器指令。
当选择一个方法进行编译时,JVM 会将其字节码提供给即时编译器 (JIT)。在正确编译方法之前,JIT 需要理解字节码的语义和语法。为了帮助 JIT 编译器分析方法,它的字节码首先被重新格式化成称为跟踪树的内部表示形式,该形式更接近于机器代码而不是字节码。然后对该方法的树进行分析和优化。最后,这些树被转换成本地代码。
引用: 跟踪树是一种数据结构,用于运行时编译程序代码。跟踪树用于一种“即时编译器”,该编译器跟踪热点期间执行的代码并对其进行编译。参见this

1

Jit是即时编译器的缩写。jit是一个程序,将Java字节码转换为可直接发送到处理器的指令。

在特定的系统平台上使用Java JIT编译器(实际上是第二个编译器)将字节码编译成特定的系统代码,一旦代码被Jit编译器重新编译,它通常会在计算机上运行得更快。

即时编译器随虚拟机一起提供,并且是可选使用的。它将字节码编译为特定于平台的可执行代码,立即执行。


1
一个非JIT编译器在编译时将源代码转换为特定机器的字节码。JIT编译器接受在编译时生成的与机器无关的字节码,并在运行时将其转换为特定机器的字节码。Java使用的JIT编译器使得单个二进制文件可以在多种平台上运行而无需修改。

0

即时编译器(Just In Time compiler),也称 JIT 编译器,用于提高 Java 的性能。它默认启用,并在执行时进行编译,而不是之前。Java 通过将 JIT 编译器包含在 JVM 中,推广了其使用。


0

字节码的20%在80%的时间内被使用。JIT编译器获取这些统计数据,并通过添加内联方法、删除未使用的锁等方式来优化这20%的字节码,同时还会创建特定于该机器的字节码。我引用了这篇文章,我觉得它很有用。http://java.dzone.com/articles/just-time-compiler-jit-hotspot


不确定为什么这被标记为-1。我认为这里的重点是运行时统计信息被用来帮助优化。 - eze
2
是的,但答案没有这样表述。字面上来说,JIT 不会优化代码中最热门的 20%。 - mabraham

-1
JVM 为了性能原因实际上在运行时执行编译步骤。这意味着 Java 没有清晰的编译 - 执行分离。它首先从 Java 源代码进行静态编译生成字节码,然后将字节码传递给 JVM 进行执行。但是执行字节码很慢,因此 JVM 测量字节码运行频率,并在检测到非常频繁运行的代码“热点”时,执行从字节码到“热点”代码的机器码的动态编译(热点分析)。因此,今天的 Java 程序实际上是通过机器码运行的。

-1
JIT 指的是在几个 JVM 实现中的执行引擎,其中一个更快但需要更多内存的是即时编译器。在这种方案中,方法的字节码在第一次调用该方法时被编译为本机机器代码。然后缓存该方法的本机机器代码,以便下次调用相同方法时可以重复使用。

3
如果您没有提供新的/更好的信息,我会避免回答这样的问题。如果您得到任何反应,那可能是负评或批评:您的答案不准确。 "JIT" 不仅限于 Java虚拟机, "更快但使用更多内存" 是 JIT 概念的可能效果,而不是固有特性;方法通常不会在第一次调用时编译,而是在多次调用后,当 JIT 化的时间总体上是优势时开始编译。 - zapl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接