热点探测

热点探测


当虚拟机发现某个方法或代码块运行的特别频繁时,就会把这些代码认定为“热点代码”(Hot Spot Code)。

判断一段代码是不是热点代码的这种行为被称为“热点探测”(Hot Spot Detection),目前主流的热点代码判定方法有两种,分别如下:

  • 基于采样的热点探测(Sample Based Hot Spot Detection)

这种探测方法的实现原理是虚拟机周期性的检查各个线程的虚拟机栈的栈顶,如果发现某个方法经常出现在栈顶,那么就认为这个方法是“热点方法”。这种探测方法的优点是实现简单、高效,还可以很容易的获取方法调用关系(将堆栈展开即可),缺点是难以精确的确认一个方法的热度,例如由于线程阻塞造成某个方法长时间处于栈顶,方法可能被误判为热点方法。

  • 基于计数器的热点探测(Counter Based Hot Spot Detection)

这种探测方法的实现原理是虚拟机为每个方法(甚至是代码块)建立计数器,统计各个方法的执行次数,如果执行次数超过一定的阈值就认为它是“热点方法”。这种探测方法的缺点是实现起来较为麻烦,需要为每个方法建立并维护计数器,并且不能直接获取到方法的调用关系,但优点是统计的结果更加精准和严谨。

一般来说,计数器记录的不是方法被调用的绝对次数,而是一个相对的执行频率,即一段时间内被调用的次数。当超过一定的时间限度,如果方法的调用次数仍然达不到被判断为“热点方法”的阈值,虚拟机会将这个方法的调用计数器的数值减半,这个过程被称为方法调用计数器热度的衰减(Counter Decay),而这段时间就称为次方法统计的半衰周期(Counter Half Life Time)。

若计数器记录的是方法被调用的绝对次数,只要程序的运行时间足够长,绝大部分方法最终都会被判定为“热点方法”,并被编译成本地代码。

猜你喜欢

转载自www.cnblogs.com/XiaoZhengYu/p/13381839.html