编译执行: 通过编译器,将高级语言代码编译成对应平台的机器码文件,交于对应平台执行。机器码就是直接能被计算机理解的代码。
解释执行: 通过解释器,在代码执行时逐条翻译成机器码,不做保存。
即时编译(JIT): 将热点代码编译成与本地平台相关的机器码,并保存到内存。
编译执行只需要在线下编译一次,而解释执行则每次都需要编译,所以运行效率上编译执行更高。
Java中HopSpot虚拟机默认采用混合模式,综合了解释执行和即时编译的优点。它会先解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译。
即时编译建立在程序符合二八定律的假设上,也就是百分之二十的代码占据了百分之八十的计算资源。
对于占据大部分的不常用的代码,我们无需耗费时间将其编译成机器码,而是采取解释执行的方式运行;另一方面,对于仅占据小部分的热点代码,我们则可以将其编译成机器码,以达到理想的运行速度。
理论上讲,即时编译后的 Java 程序的执行效率,是可能超过 C++ 程序的。这是因为与静态编译相比,即时编译拥有程序的运行时信息,并且能够根据这个信息做出相应的优化,峰值性能更好。
FAQ:
- 为什么不把java代码全部编译成机器码?
事实上JVM确实有考虑做AOT (ahead of time compilation) 这种事情。AOT能够在线下将Java字节码编译成机器码,主要是用来解决启动性能不好的问题。
JVM这样做,主要也是看重字节码的可移植性,而牺牲了启动性能。
对于这种长时间运行的程序,其实选择线下编译和即时编译都一样,因为至多一两个小时后该即时编译的都已经编译完成了。另外,即时编译器因为有程序的运行时信息,优化效果更好,也就是说峰值性能更好。
文章参考以下书籍资料:
《深入拆解Java虚拟机》,《深入理解java虚拟机》
欢迎访问我得博客,她和他的猫
58

被折叠的 条评论
为什么被折叠?



