解释字节码与编译字节码?

我已经看到一些关于JVM / JIT活动的参考文献,其中似乎在编译字节码和解释字节码之间有所区别。 特定注释声明字节码被解释为前10000次运行并在此后编译。

“编译”和“解释”字节码有什么区别?

解释字节代码基本上逐行读取字节码,不做任何优化或任何事情,并解析它并实时执行它。 由于多种原因,这显然是低效的,包括Java字节码未被设计为快速解释的问题。

编译方法时,JIT加载整个方法并生成本机代码以直接在CPU上运行,而不是逐行读取和解释字节代码。 编译该方法一次后,每次调用该方法时都会直接使用生成的本机代码。 这在天文学上更快,但在编译方法时会产生一些开销; 除此之外,JVM还负责仅编译经常调用的方法,以最大限度地减少开销,同时最大限度地提高经常被调用的“紧密内循环”代码的性能。

当字节码是相互作用时,它通过JVM解释器而不是直接在处理器上执行,在编译时,它被编译为本机机器语言并直接在CPU上执行。

JVM具有Just In Time(JIT编译器); 可以将足够重复的代码部分编译成本机汇编代码以加速它。

请注意,更改仅在JVM中完成,类​​(jar / war)文件不会更改并保留为字节码。