第十一章 晚期(运行期)优化
1、HotSpot同时包含解释器和编译器,HotSpot中内置了两个即时编译器Client Compiler 和 Server Compiler或简称C1和C2编译器(也叫Opto编译器)。用户可以使用-client或-server参数支强制指定虚拟机运行在Client模式还是Server模式。解释器与编译器搭配使用的方式在虚拟机中被称为“混合模式”(Mixed Mode),用户可以使用-Xint强制虚拟机运行于“解释模式”(Interpreted Mode),这时候编译器完全不介入工作,全部代码都使用解释方式执行。另外也可以使用参数-Xcomp强制虚拟机运行于“编译模式”(Compiled Mode),这时候将优先彩编译方式执行程序,但是解释器仍然要在编译无法进行的情况下介入执行过程,可能通过虚拟机的-version命令的输出结果显示出这三种模式。
2、为了在程序启动响应速度与运行效率之间达到最佳地平衡,HotSpot虚拟机将会逐渐雇用分层编译(Tiered Compilation)的策略。分层编译根据编译器编译、优化的规模与耗时,划分出不同的编译层次,其中包括:
第0层:程序解释执行,解释器不
开启性能监控功能(profiling),可触发第1层编译。
第1层:也称为C1编译,将字节码编译为本地代码,进行简单可靠的优化,如有必要将加入性能监控的逻辑。
第2层:也称为C2编译,也是将字节码编译为本地代码,但是会启用一些编译耗时较长的优化,甚至会根据性能监控信息进行一些不可靠的激进优化。
Tiered Compilation 的概念在JDK1.6时期出现,但JDK1.7之前需要使用-XX:+TieredCompilation参数来手动开启,如果不开启分层编译策略,而虚拟机又运行在Server模式,Server Compiler需要性能监控发售提供编译依据,则可以由解释器收集性能监控信息供Server Compiler使用。