JVM底层原理之热点代码和HotSpotVM的运行流程
热点代码(Hot Spot Code)和热点探测java字节码文件(.class文件)是先以解释执行的方式被加载到虚拟机中 , 然后JIT编译器在程序运行过程中 , 对“热点代码”进行动态的编译 , 将这部分代码编译成机器可以直接执行的机器码(native code) , 同时也会对代码进行优化 , 从而提高运行效率 。
而这个热点代码就是通过Hotspot JVM探测出来的 , 这个探测行为就叫做热点探测 。
热点探测的检测机制根据不同的虚拟机 , 有不同的探测方法 , 目前主要有两种 , 分别是基于采样的热点探测和基于计数器的热点探测 。 当然还有一些其他的 , 例如基于踪迹的热点探测 , 只是相对没有那么主流而已 , 这里我简单说明一下这两种探测方式 , 当然重点关注的还是HotSpot虚拟机使用的探测方式:基于计数器的热点探测 。
基于采样的热点探测(典型应用:C9 虚拟机)采用这种方法的虚拟机会周期性的检查各个线程的栈顶 , 若某个或某些方法经常出现在栈顶 , 那这个方法就是“热点方法” 。
优点:实现简单 , 并且因为检查的是栈 , 所以可以很容易的获取方法调用的关系 。
缺点:容易受到线程阻塞或其他因素影响 , 具有较大随机性 , 很难精确的确定方法的热度 。
基于计数器的热点探测(典型应用:HotSpot 虚拟机)采用这种方法的虚拟机会为每个方法(甚至是代码块)建立并维护计数器 , 统计方法的执行次数 , 执行次数超过设定的阈值就会认为它是热点方法 。
优点:能更加精确和严谨的统计出代码的热度 。
缺点:需要额外负担维护计数器的开销 , 不能直接获取到方法的调用关系 , 探测和计算热点代码更麻烦了 。
HotSpotVM执行方法的流程我们现在知道了HotSpotVM是怎么检测热点代码的了 , 现在我们大体的过一下整体的交互流程 。
①当方法执行 , 先检查是否存在被JIT编译的版本
如果存在 , 则用编译的本地代码执行 , 然后没了
【流媒体|JVM底层原理之热点代码和HotSpotVM的运行流程】如果不存在 , 则方法调用计数器计数+1 , 继续步骤②
②判断两个计数器之和是否超过方法调用计数器的阈值
如果超过 , 则向编译器提交编译请求 , 继续步骤③
如果没超过?那就不提交编译请求了呗(废话) , 继续步骤③
③然后继续用解释的方式执行方法
④如果有循环代码(遇到回边指令) , 检查是否存在被编译的代码
如果存在 , 则用编译的本地代码执行 , 然后没了
如果不存在 , 则回边计数器计数+1 , 继续步骤⑤
⑤判断两个计数器之和是否超过回边计数器的阈值
如果超过 , 则向JIT编译器提交触发OSR的编译请求 , 并继续进行循环 , 跳到步骤④ , 直到方法调用结束 。
另外 , 我们可以通过启动参数 , 设置让解释器等待JIT编译 , 也就是它不会在提交编译请求或继续解释执行了 , 而是坐下来等JIT编译结束 , 然后执行JIT编译的代码 。 不过这样做显然效率影响太多了 , 所以我也不贴参数了 , 感兴趣的话可以自己去了解一下 。
- |为什么引流推广没有效果?这就是引流的底层逻辑,千万别错过
- VR|社区团购为什么会全线溃败?为你揭秘社群营销的底层逻辑
- |观察 | 迪士尼牵手腾讯视频,全球流媒体开启“外卷”时代?
- 流媒体|第一极品 N-05 XD 流媒体播放器评测:无论怎么用都堪称完美
- 流媒体|赵月瀚:美团借钱逾期会被起诉吗?
- jvm|JVM底层原理之什么是分层编译?
- jvm|JVM底层原理之如何选用C1、C2编译器?它们有什么区别?
- jvm|美国资本的无序扩张严重威胁世界了
- jvm|vivo X80对比红米K50 Pro反应速度,堪称棋逢对手!
- 工业互联网|自媒体的底层逻辑