jvm热点代码检测机制 #jvm运行期优化#

1. 基于采样的热点探测

采用这种方法的虚拟机会周期性地检查各个线程的栈顶,如果发现某个方法经常出现在栈顶,这个方法就是热点方法。

优点:这种方法实现起来较为简单,可以很容易的获取方法调用的关系
缺点:是由于有线程阻塞或别的因素影响,无法精确的对热点进行探测

2. 基于计数器的热点探测

采用这种方法的虚拟机会为每个方法(甚至是代码块)建立并维护计数器,统计方法的执行次数,执行次数超过一定的阀值就会认为它是热点方法
优点:这种方式更加精确和严谨
缺点:但统计时需要为每个方法建立并维护计数器,而且不能获取方法的调用关系,实现起来较为麻烦

计数器分两类:

  • 方法调用计数器:统计一段时间内方法被调用的次数,当超过一个时间限度,它的调用次数仍然不足以给JIT编器编译,这个方法的调用计数久会减半,统计方式不是绝对的。
  • 回边计数器:主要是统计循环体内的代码执行的次数,在字节码遇到控制流后向后跳转的指令称为回边,建立回边计数器也是为了触发OSR。因为有些情况下,比如空的循环,照样会执行对应的次数,但它是直接跳转到自己,所以JIT编译器去编译这种代码是没有任何意义的。

3. 基于踪迹(Trace)的热点探测

采用这种方式的虚拟机是将一段频繁执行的代码作为一个编译单元,并仅对该代码片段进行编译,该代码片段由一个线性且连续的指令序列组成,仅有一个入口,但有多个出口。也就是说,基于踪迹而编译的热点代码不仅仅局限在一个单独的方法或者代码快中,一条Trace可能对应多个方法,代码中频繁执行的路径就可能被识别成不同的踪迹。
优点:因此这种方法有着更高的精度,并且能够避免编译不是频繁执行的代码,减少不必要的编译开销
缺点:但这种方法的实现就更为的复杂。

你可能感兴趣的:(jvm热点代码检测机制 #jvm运行期优化#)