解释字节码与编译字节码



我遇到了一些关于JVM/JIT活动的参考资料,其中似乎在编译字节码和解释字节码之间进行了区分。特定的注释声明字节码在前 10000 次运行中被解释,并在此后进行编译。

"

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

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

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

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

JVM具有准时制(JIT编译器);重复得足够多的代码部分可以编译成本机汇编代码以加快速度。

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

最新更新