Jvm 为什么不是';难道所有的java字节码最初都解释为机器码吗?

Jvm 为什么不是';难道所有的java字节码最初都解释为机器码吗?,jvm,interpreter,java,bytecode,Jvm,Interpreter,Java,Bytecode,我读过,据我所知,有两种方法可以实现这一点——和JIT,这两种方法都是在运行时解释 为什么不先准备好将所有字节码转换成机器码,然后才开始运行这个过程而不再需要解释器呢 简单:因为将所有内容预编译到机器代码需要时间。用户不希望等待应用程序启动。请记住,预编译必须进行大量优化,这需要时间 JVM的服务器版本在预先编译和优化代码方面更具攻击性,因为在进程关闭之前,服务器端的代码往往执行得更频繁,执行时间更长 但是,一个解决方案(针对.Net)是一个名为NGen的应用程序,它预先进行预编译,以便在该点之

我读过,据我所知,有两种方法可以实现这一点——和JIT,这两种方法都是在运行时解释


为什么不先准备好将所有字节码转换成机器码,然后才开始运行这个过程而不再需要解释器呢

简单:因为将所有内容预编译到机器代码需要时间。用户不希望等待应用程序启动。请记住,预编译必须进行大量优化,这需要时间

JVM的服务器版本在预先编译和优化代码方面更具攻击性,因为在进程关闭之前,服务器端的代码往往执行得更频繁,执行时间更长

但是,一个解决方案(针对.Net)是一个名为NGen的应用程序,它预先进行预编译,以便在该点之后不再需要它。你只需要跑一次


并非所有虚拟机都包含解释器。例如,Chrome和CLR(.Net)总是在运行之前编译成机器代码。但是,它们有多个级别的优化来减少启动时间。

延迟JIT编译的另一个原因与优化有关:在运行时,VM可以检测到比编译器在编译时所能检测到的更多/其他可能优化的模式。JIT在启动时的预编译必须始终是静态的,而且编译器也可以已经这样做了,但是通过对实际运行时行为的分析,VM可能会获得更多关于可能的优化的信息,因此可能会产生更好的优化结果

例如,虚拟机可以检测到一段代码在运行时实际运行了一百万次,并执行编译器可能不知道的适当优化,这与现代CPU在运行时进行的分支预测不同。
更多信息可以在上的Wikipedia文章中找到。

我发现了运行时重新编译如何优化性能和节省额外的CPU周期

  • 内联扩展:减少过程调用的成本
  • 删除冗余负载:当2个编译代码产生一些重复代码时,可以删除它,并在运行时通过重新编译进一步优化
  • 复制传播
  • 消除死代码

对于上面给出的相同解释,这里有另一个解释。

此外,它可以对行为进行假设,然后在以后违反这些假设的情况下动态重新编译。这一点很重要,因为否则您无法真正内联虚拟函数。+1,但我们在编译器中也有配置文件引导优化,因此同样的事情(ish)也可以在编译时完成。“没有什么比真实的东西更好。”;)-但是概要文件引导的优化方向是相同的。供参考: