我遇到了一些关于JVM / JIT活动的引用,其中似乎在编译字节码和解释字节码之间存在差异。特定注释声明字节码被解释为前10000次运行并在之后编译。
“编译”和“解释”字节码有什么区别?
答案 0 :(得分:15)
解释字节代码基本上逐行读取字节码,不进行优化或任何操作,并解析并实时执行。出于多种原因,这显然是低效的,包括Java字节码不能快速解释的问题。
编译方法时,JIT加载整个方法并生成直接在CPU上运行的本机代码,而不是逐行读取和解释字节代码。在编译该方法一次之后,每次调用该方法时都会直接使用生成的本机代码。这在天文学上更快,但在编译方法时会产生一些开销;除此之外,JVM只负责编译经常调用的方法,以最大限度地减少开销,同时最大限度地提高经常被调用的“紧密内循环”代码的性能。
答案 1 :(得分:3)
当字节码是字符串时,它通过JVM解释器执行,而不是直接在处理器上执行,编译时,它被编译为本机机器语言并直接在CPU上执行。
答案 2 :(得分:1)
JVM具有Just In Time(JIT编译器);可以将足够重复的代码部分编译到本机汇编代码中以加快速度。
请注意,更改仅在JVM中完成,类(jar / war)文件不会更改并保留为字节码。