即时编译
JIT除了具有缓存的功能外,还会对代码做各种优化,包括:逃逸分析、 锁消除、 锁膨胀、 方法内联、 空值检查消除、 类型检测消除、 公共子表达式消除。
热点代码探测
什么会成为热点代码?
被多次调用的方法。一个方法被调用得多了,方法体内代码执行的次数自然就多,成为“热点代码”是理所当然的。
被多次执行的循环体。一个方法只被调用过一次或少量的几次,但是方法体内部存在循环次数较多的循环体,这样循环体的代码也被重复执行多次,因此这些代码也应该认为是“热点代码”。
如何检测热点代码?
基于采样的热点探测:采用这种方法的虚拟机会周期性地检查各个线程的栈顶如果发现某个(或某些)方法经常出现在栈顶,那这个方法就是“热点方法”
-
优点:实现简单高效,容易获取方法调用关系(将调用堆栈展开即可)
-
缺点:不精确,容易因为因为受到线程阻塞或别的外界因素的影响而扰乱热点探测
基于计数器的热点探测:采用这种方法的虚拟机会为每个方法