【发布时间】:2010-08-02 04:01:50
【问题描述】:
Java 代码被编译成字节码,它可以在许多平台上移植。 但是 Java 也是即时编译的。
这是否意味着 Java 需要编译两次?首先由我们生成字节码,第二个由 JVM 生成? 谢谢。
【问题讨论】:
Java 代码被编译成字节码,它可以在许多平台上移植。 但是 Java 也是即时编译的。
这是否意味着 Java 需要编译两次?首先由我们生成字节码,第二个由 JVM 生成? 谢谢。
【问题讨论】:
如果“足够热”,JVM 可能会将您的代码从字节码编译为本机代码;并且它可能会被多次编译,旧版本会被丢弃,具体取决于程序的运行时特性。
JIT 是一头复杂的野兽;事实上,Sun JVM 有两个 JIT(-client 和 -server),它们的行为彼此不同,有些实现甚至支持两个 JIT 一起运行(因此您可能已经解释了字节码与应用程序中两个不同 JIT 编译的代码一起运行) .
如果您真的对这个主题感兴趣,我建议您阅读更多关于 Hotspot(最常见的 JIT,因为它是 Sun 的 JIT)的内容。你可以从Sun's page开始。
【讨论】:
TMK,当您编译时,您正在为 JVM 平台进行编译。然后,当您在任何机器上的 JVM 上运行应用程序时,经常使用的某些代码部分会被编译为 该机器的本地代码以进行优化。
简而言之:是的,但有一个很好的理由
【讨论】:
这是否意味着 Java 需要编译两次? 首先由我们生成字节码 第二个是JVM?谢谢。
您可以说,一旦使用源代码(编译器)中可用的信息,然后在运行时(JVM/JIT)中使用有关特定硬件的信息可用,以及一些 profiling 来决定哪些内容可以被 JIT 编译。
【讨论】:
机制是
Java -> 字节码(由java编译器编译)
ByteCode -> 本机代码(由 JVM 解释)
【讨论】:
简短的回答:是的。
最长的一个:那是两个不同的东西。 第一次编译是从源代码到字节码,编译领域常称为中间表示(IR)。
然后,VM 获取字节码并将其转换回它所安装平台的本机代码。
这是两种完全不同的编译方式。第二个甚至不是完全编译,因为没有语法检查器范围分析器......嗯,有一些检查,但与编译器中的检查不同。
【讨论】: