编译执行、解释执行、即时编译(JIT)

编译执行: 通过编译器,将高级语言代码编译成对应平台的机器码文件,交于对应平台执行。机器码就是直接能被计算机理解的代码。

解释执行: 通过解释器,在代码执行时逐条翻译成机器码,不做保存。

即时编译(JIT): 将热点代码编译成与本地平台相关的机器码,并保存到内存。


编译执行只需要在线下编译一次,而解释执行则每次都需要编译,所以运行效率上编译执行更高。


Java中HopSpot虚拟机默认采用混合模式,综合了解释执行即时编译的优点。它会先解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译。

即时编译建立在程序符合二八定律的假设上,也就是百分之二十的代码占据了百分之八十的计算资源。


对于占据大部分的不常用的代码,我们无需耗费时间将其编译成机器码,而是采取解释执行的方式运行;另一方面,对于仅占据小部分的热点代码,我们则可以将其编译成机器码,以达到理想的运行速度。


理论上讲,即时编译后的 Java 程序的执行效率,是可能超过 C++ 程序的。这是因为与静态编译相比,即时编译拥有程序的运行时信息,并且能够根据这个信息做出相应的优化,峰值性能更好。


FAQ:

  1. 为什么不把java代码全部编译成机器码?

事实上JVM确实有考虑做AOT (ahead of time compilation) 这种事情。AOT能够在线下将Java字节码编译成机器码,主要是用来解决启动性能不好的问题。

JVM这样做,主要也是看重字节码的可移植性,而牺牲了启动性能。

对于这种长时间运行的程序,其实选择线下编译和即时编译都一样,因为至多一两个小时后该即时编译的都已经编译完成了。另外,即时编译器因为有程序的运行时信息,优化效果更好,也就是说峰值性能更好。

文章参考以下书籍资料:
《深入拆解Java虚拟机》,《深入理解java虚拟机》
欢迎访问我得博客,她和他的猫

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值