Java JIT编译器在编译时或运行时编译?

时间:2010-06-15 07:09:30

标签: java

来自wiki:在计算中,即时编译(JIT),也称为动态转换,是一种用于提高计算机程序运行时性能的技术。

所以我猜JVM有另一个编译器,而不是javac,只在运行时将字节码编译为机器码,而javac将源代码编译为字节码,是吗?

5 个答案:

答案 0 :(得分:3)

是的,JIT在运行时工作。

Javac将java源转换为java字节码。 JVM解释该字节码或将其编译为本机代码。但这不是翻译源的步骤,因为JIT编译器没有任何用户前端。此外,JIT仅针对热门方法运行 - 最常见的方法。

答案 1 :(得分:3)

这是完全正确的。

Suns JVM(以及我认为的大多数其他),不会立即将整个类文件编译成机器代码,而是运行应用程序一段时间以便检测代码中的热点,这将是受益于编译(而不是解释),并编译“及时”。

答案 2 :(得分:3)

这是完全正确的。

  • javac.java源代码编译为.class JVM字节码(Java 虚拟机器)
  • HotSpot,在运行时,识别字节码的哪一部分值得进一步编译到运行平台的性能指令

另见


更多的编译器可以参与进来!

请注意,除了Java之外的其他语言也可以通过编译为JVM字节码的自己的编译器加入其中,然后使用任何JVM运行时运行。在HotSpot上,这也意味着他们将获得JIT编译。

另见

答案 3 :(得分:1)

这种用于获取本机机器代码的两步编译过程实际上也适用于大多数静态编译的语言,例如C和C ++。首先,他们将代码编译成一个临时格式,如2-3代码,然后第二个编译器将其转换为本机机器代码。分离到前端和后端编译器的目的是使编译器移植到不同的机器架构或接受不同的输入语言变得更加容易。 GCC是静态编译器的一个很好的例子,由于这种架构,它非常通用。

在运行时进行最终转换的好处是,除了在运行应用程序之前不必选择目标机器架构之外,还有关于程序实际运行方式的其他信息。这可以非常有效地用于改进最终编译。

答案 4 :(得分:0)

编译时间 - javac将java代码编译为字节码(.class文件)。

运行时 - JVM将字节码解释为机器代码。 JIT是一种优化,通过检测热点(例如,在Sun JVM中)和预先编译代码,可以更快地执行字节码。