解释器
1.初衷:单纯的实现Java程序的跨平台,避免采用静态编译将其转化为机器指令,运行时采用逐行解释字节码并执行程序。
2.工作机制
(1)担任翻译者,将字节码文件中的内容翻译为机器指令并执行
(2) 每执行完一条指令后,便根据pc程序计数器执行下一条指令
3.分类
两套解释执行器为古老的字节码解释器和模板解释器。
字节码解释器:执行时通过纯软件代码模拟字节码的执行,效率低下
模板解释器:执行时将每一条字节码和一个模板函数相关联,模板函数直接产生这条字节码的机器指令,提高解释器的性能。
由于解释器的设计和实现上非常简单,因此除Java语言外,其他高级语言也拥有同样的解释器,且解释器的执行效率低,jvm也支持jit编译器。
JIT编译器
1.避免函数被直接解释执行,先将整个函数体编译成机器指令,再执行相应的机器指令,提高执行效率。
2.Java语言的编译过程时一段不确定的操作过程,可以是以下任意一种:
(1)前端编译器:把*.java文件转化为*.class(字节码文件)的过程
(2)后端编译器(jit编译):把字节码转为机器码的过程
(3)静态提前编译器(AOP):直接把*.java文件编译为本地机器码的过程
3.采用热点代码及探测方式
根据代码被调用执行的频率,在执行期间根据哪些经常被调用的热点代码做深度优化,将其直接编译为机器码,提高执行效率。
4.热点代码
(1)一个被多次调用的方法
(2)一个方法体内部循环多次的循环体
5.不同虚拟机采用的热点探测方式不同,其中hotspot vm 采用基于计数器的热点探测方式,为每个方法建立两个不同类型的计数器,即调用计数器和回边计数器,分别用于统计方法的调用次数和循环体的执行次数。
6.在Client模式下,阈值为1500,server下阈值为10000,超过便会触发jit编译,可通过虚拟机参数-xx:compileThreshold设置