Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java代码与JIT编译_Java_Jit - Fatal编程技术网

Java代码与JIT编译

Java代码与JIT编译,java,jit,Java,Jit,Java代码被编译成字节码,可以跨多个平台移植。 但是Java也是实时编译的 这是否意味着Java要编译两次?首先由我们生成字节码,第二个由JVM生成? 谢谢。TMK,编译时您是在为JVM平台编译。然后,当您在任何机器上的JVM上运行应用程序时,经常使用的某些代码部分会被编译成该机器的本机代码以进行优化 简言之:是的,但有一个很好的理由 这是否意味着Java要编译两次? 首先由我们来产生字节码 第二个是JVM?谢谢 您可以说,一旦使用源代码(编译器)中可用的信息,那么另一个在运行时(JVM/JI

Java代码被编译成字节码,可以跨多个平台移植。 但是Java也是实时编译的

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

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

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

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


您可以说,一旦使用源代码(编译器)中可用的信息,那么另一个在运行时(JVM/JIT)中,当有关特定硬件的信息可用时,以及一些评测来决定什么是JIT编译还是不编译。

如果JVM“足够热”,您的代码可能会从字节码编译成本机代码;根据程序的运行时特征,它可能会被编译多次,旧版本会被丢弃

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

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

机构是

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


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

简短回答:是的

最长的一个:那是两个不同的东西。 第一次编译是从源代码到字节码,通常在编译字段中调用中间表示(IR)

然后VM获取字节码并将其转换回安装在哪个平台上的本机代码


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

这是对的,;JVM将进一步将部分代码编译成本机代码,以便运行得更快(因为本机代码和Java字节码之间没有更多的抽象)。这种运行时编译的行为被称为JIT编译,所以只有经常使用的代码才是JIT编译的?这对我来说是一个新的信息,谢谢。如果说字节码被替换为等效的本机代码,而不是被重新编译,可能会更正确。编译通常比代码替换/优化要复杂得多。更准确地说,“某些部分”->“方法”和“经常使用”->“达到系统属性os400.jit.mmi.threshold的计数”为什么可以多次编译?为什么第一次编译字节码是不够的?很多事情都会导致JIT放弃旧的编译;采取以前从未采取过的不同分支这样简单的事情可能会导致JIT发出“错误”并丢弃旧代码(这是基于每次采取的相同分支)。此外,有时它会“以防万一”地编译代码,即使之前没有执行该方法。然后,当调用该方法时,它会将其重新编译为更优化的版本。