最初java程序是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器!
即时编译器并不是虚拟机必须的,但是一个即时编译器编译性能的好坏、代码优化程度的高低确实衡量一款商用虚拟机优秀与否的最关键的指标之一,他要是虚拟机最核心最能体现技术水平的部分。
要解决的问题:
①为何HotSpot虚拟机要使用解释器与编译器并存的架构?
②为何HotSpot虚拟机要实现两个不同的监视编译器
③程序何时使用解释器执行?何时使用编译器执行?
④哪些程序代码会被编译为本地代码?如何编译为本地代码?
⑤如何从外部观察即时编译器的编译过程和编译结果?
1.解释器与编译器
很多主流的商用虚拟机,都采用了解释器与编译器并存的架构,如HotSpot、J9等。
解释器与编译器两者各有优势:当程序需要快速启动和执行的时候,解释器可以首先发挥作用,省去编译的时候,立即执行。在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获取更高的执行效率。当程序运行环境中内存资源限制较大,可以使用解释执行节约内存,反之可以使用编译执行来提升效率。
同时,解释器还可以作为编译器激进优化时的一个“逃生门”,让编译器根据概率选择一些大多数时候都能提升运行速度的优化手段