性能调优——编译优化技术

即时编译器JIT:为了提高热点代码执行效率,虚拟机将热点代码编译成本地平台相关机器码,并进行各种层次的优化,完成此任务的编译器就叫即时编译器

什么是热点代码?

热点代码就是程序中频繁执行的方法或者代码块

如何判定热点代码?

基于采样的热点探测:周期性的检查各个线程中的栈顶,某些代码(方法)经常出现于栈顶,就属于热点代码

该方法的优缺点?
优点:获取方法之间调用关系(通过堆栈展开)
缺点:无法精确到具体热度,容易受线程阻塞等外界因素扰乱热点探测

基于计数器的热点探测:为每个方法(代码块)设置计数器,统计执行次数,执行次数超过一定阈值就被认为是热点方法

该方法的优缺点?
优点:可以获取精确热度
缺点:需要为每个方法建立计数器,不能获取方法之间具体调用关系

Tips: HotSpot虚拟机基于计数器探测方法(方法调用计数器和回边计数器)。

计数器超过一定阈值就会触发JIT编译

默认阈值Client模式下是1500次,Server模式下是10000。可以通过-XX:CompileThresold和-XX :BackEdgeThresold进行设置。还可通过-XX:OnStackReplacePercentage间接设置

计算公式:

虚拟机在Client模式下:

回边计数器阈值计算公式 = 方法调用计数器阈值 * OSR比率(OnStackReplacePercentage) / 100

OnStackReplacePercentage默认值933。 都取默认值的情况下,阈值为13995

虚拟机在Server模式下:

回边计数器阈值计算公式 = 方法调用计数器阈值 * OSR比率(OnStackReplacePercentage) - 解释器监控比率(InterpreterProfilePercentage) / 100

OnStackReplacePercentage默认值140。 InterpreterProfilePercentage默认值33,都取默认值的情况下,阈值为10700

编译过程

JVM参数

-XX:printCompilation 要求虚拟机在JIT时将编译成本地代码的方法名称打印出来

-XX:+PrintCFGToFile
-XX:PrintIdealGraphFile
将虚拟机各个级段的数据输出到文件

-XX:CompileThresold
-XX :BackEdgeThresold
-XX:OnStackReplacePercentage