解释器和JIT编译器
执行引擎的执行完全依赖PC寄存器。前端编译由javac完成,后端编译由执行引擎完成。
解释器:对字节码采用逐行解释的方式执行,将每条字节码内容翻译为本地机器指令执行
JIT编译器:虚拟机将源代码直接翻译成和本地机器平台相关的机器语言
何时使用JIT编译器?
一个被多次调用的方法,或者是一个方法体内部循环次数较多的循环体都可被称之为“热点代码”,都可以通过JIT编译器编译为本地机器指令。由于这种编译方式在方法执行过程中,因此称之为栈上替换,或简称OSR。
具体多少次可达到标准,需要一个阔值,主要依靠热点探测。HotSpot采用的热点探测方式是基于计数器的热点探测。建立两个不同类型的计数器,分别为方法调用计数器(方法的调用次数)和回边计数器(循环体循环次数)。
方法调用计数器,client默认1500次,service默认10000次,草果就触发JIT编译。阔值设置参数-XX:CompileThreshold。
热度衰减,一段时间内达不到次数,就会减少一半,这段时间就称之为半衰周期。虚拟机参数-XX:-UseCounterDecay设置是否进行热度衰减。可通过-XX:CounterHalfLifeTime参数设置半衰周期,单位是秒。
Java虚拟机内部有两个JIT编译器,-client和-service,64位操作系统默认-service。区别就是-service优化强一些。C1的优化主要是方法内联、去虚拟化、冗余消除;C2的优化主要在全局层,逃逸分析是优化的基础:标量替换、账上分配、同步消除(synchronized)。
可用参数设置解释器和JIT编译器混的使用:
-Xint解释器
-Xcomp编译器器
-Xmixed混合使用