【问题标题】:Java code and JIT compilationJava 代码和 JIT 编译
【发布时间】:2010-08-02 04:01:50
【问题描述】:

Java 代码被编译成字节码,它可以在许多平台上移植。 但是 Java 也是即时编译的。

这是否意味着 Java 需要编译两次?首先由我们生成字节码,第二个由 JVM 生成? 谢谢。

【问题讨论】:

    标签: java jit


    【解决方案1】:

    如果“足够热”,JVM 可能会将您的代码从字节码编译为本机代码;并且它可能会被多次编译,旧版本会被丢弃,具体取决于程序的运行时特性。

    JIT 是一头复杂的野兽;事实上,Sun JVM 有两个 JIT(-client 和 -server),它们的行为彼此不同,有些实现甚至支持两个 JIT 一起运行(因此您可能已经解释了字节码与应用程序中两个不同 JIT 编译的代码一起运行) .

    如果您真的对这个主题感兴趣,我建议您阅读更多关于 Hotspot(最常见的 JIT,因为它是 Sun 的 JIT)的内容。你可以从Sun's page开始。

    【讨论】:

    • 为什么可以编译多次?为什么第一次编译的字节码不够用?
    • 很多事情都会导致 JIT 丢弃旧的编译;像采用以前从未采用过的不同分支这样简单的事情可能会导致 JIT 发出“错误”并丢弃旧代码(这是基于每次采用相同的分支)。
    • 有时即使该方法之前没有执行过,它也会“以防万一”编译代码。然后,当调用该方法时,它会将其重新编译为更优化的版本。
    【解决方案2】:

    TMK,当您编译时,您正在为 JVM 平台进行编译。然后,当您在任何机器上的 JVM 上运行应用程序时,经常使用的某些代码部分会被编译为 该机器的本地代码以进行优化。

    简而言之:是的,但有一个很好的理由

    【讨论】:

    • 这是正确的; JVM 将进一步将部分代码编译为本机机器码,使其运行得更快(因为本机机器码和 Java 字节码之间不再有抽象)。这种运行时编译的行为称为 JustInTime (JIT) 编译。
    • 那么只有经常使用的代码才JIT编译?这对我来说是一个新信息,谢谢。
    • 用等效的本机代码替换而不是重新编译可能更正确。编译通常是一个比代码替换/优化复杂得多的过程。
    • 更准确地说,“某些部分”->“方法”和“经常使用”->“从系统属性os400.jit.mmi.threshold达到计数”
    【解决方案3】:

    这是否意味着 Java 需要编译两次? 首先由我们生成字节码 第二个是JVM?谢谢。

    您可以说,一旦使用源代码(编译器)中可用的信息,然后在运行时(JVM/JIT)中使用有关特定硬件的信息可用,以及一些 profiling 来决定哪些内容可以被 JIT 编译。

    【讨论】:

      【解决方案4】:

      机制是

      Java -> 字节码(由java编译器编译)

      ByteCode -> 本机代码(由 JVM 解释)

      【讨论】:

        【解决方案5】:

        简短的回答:是的。

        最长的一个:那是两个不同的东西。 第一次编译是从源代码到字节码,编译领域常称为中间表示(IR)。

        然后,VM 获取字节码并将其转换回它所安装平台的本机代码。

        这是两种完全不同的编译方式。第二个甚至不是完全编译,因为没有语法检查器范围分析器......嗯,有一些检查,但与编译器中的检查不同。

        【讨论】:

          猜你喜欢
          • 2015-03-23
          • 2021-03-25
          • 1970-01-01
          • 1970-01-01
          • 2010-09-19
          • 2011-10-18
          • 2013-02-26
          • 2011-03-18
          • 2021-06-28
          相关资源
          最近更新 更多