当虚拟机发现某个方法或代码块的运行特别频繁,就会把这些代码认定为“热点代码”,为了提升热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成为与本地平台相关的机器码,并进行各类层次的优化,完成这个任务的编译器称为即时编译器(Just In Time Compiler, 简称JIT编译器);优化
要知道一段代码是否是热点代码,是否是要触发即时编译,这个行为成为热点探测;目前流行的两种探测方式:
线程
1、基于采样的热点探测:采用这种方法的虚拟机会周期性地检查各个线程的栈顶,若是发现某个(某些)方法常常出如今栈顶,那这个方法就是“热点方法”。这种方式好处是实现简单高效,还能够很容易地获取方法调用关系(将调用堆栈展开便可),缺点是很难精确地确认一个方法的热度,容易由于受到线程阻塞或别的外界因素的影响而要乱热点探测;编译器
2、基于计数器的热点探测:采用这种方法的虚拟机会为每一个方法(甚至是代码块)创建计数器,统计方法的执行次数,若是执行次数超过必定的阀值就认为它是“热点方法”。这种方式实现起来比较麻烦,须要为每一个方法创建并维护计数器,并且不能直接获取到方法的调用关系,可是它的统计结果相对来讲更加精确;虚拟机