JIT入门

一:概念

JIT即时编译器,当虚拟机发现某个方法或代码块运行特别频繁时,就会把这些代码认定为热点代码,为了提高热点代码的运行效率,在运行时,虚拟机将会把这些代码编译成与本地平台的相关带代码,并进行各层次的优化。

 

二:JVM运行原理

要了解JIT首先要了解JVM编译运行过程。

 

三:为什么要使用JIT

     编译器与解释器:

     当程序需要迅速启动和执行的时候,解释器首选发挥作用,省去编译时间立即执行。

在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的本地代码编译成本地代码之后,可以获得更高的执行效率。使用即时编译可以使代码运行时提高效率。

 

四:什么时候使用JIT

说JIT比解释快,其实说的是执行编译后的代码比解释器解释执行快,并不是说编译这个过程比解释这个过程快。

JIT编译在怎么快,至少也比解释执行一次略慢一些,而要得到最后的执行结果还得再经历一个执行编译后的代码的过程。所以对于只执行一次的代码而言,使用解释执行比JIT要快,使用JIT得不偿失。

只执行一次:

  1. 只被调用一次,例如构造器
  2. 没有循环体。
  3.  

五:如何判断一段代码是否是热点代码

判断是否是热点代码,需要进行热点谈测。热点谈测的方法:

  1. 基于采样的热点探测:

   周期性检测各个线程的栈顶,发现某个方法经常出现在栈顶,就认为是热点方法。好处是简单,坏处是无法精确确认栈顶的一个热度。容易受到线程阻塞或别的原因干扰探测。

  1. 基于计数器的热点探测:

   采用这种方法的虚拟机会为每个方法,甚至每个代码块建立计数器,统计方法的执行次数,某个方法超过阙值就认为是热点方法,出发JIT。

六:hotSpot虚拟机

目前主流的HotSpot虚拟机采用解释器和编译器直接配合的方式工作。

热点探测方法HotSpot主要采用第二种,基于计数器的热点探测法,它为每个方法准备了方法调用计数器和回边计数器。

 

方法调用计数器:

用于使用统计方法被调用的次数。它的默认阙值在client模式下1500次,在server模式下是1000次。

当一个方法调用时,会首先检查该方法是否存在被JIT编译的版本,如果存在,则优先调用编译后的本地代码执行。若不存在已经编译过的版本,则将方法的调用计数器加一,然后判断方法调用计数器与回边计数器之和是否超过方法调用计数器的阙值,如果已经超过阙值,那么则会向即时编译器提交一个该方法的代码编译请求。

当超过一定的时间限度,如果方法的调用次数依然不足以让他提交给即时编译器,那这个方法的调用计数器就会被减少一半,这段时间就被称为方法统计的半衰减周期。

回边调用计数器:

统计一个方法中循环体代码的执行次数,在字节码中遇到控制流后向后转的指令称为回边。当解释器遇到一条回边指令时,会检查将要执行的代码是否有已经编译好的版本,如果有,他会优先执行已编译的代码,否则就把回边计数器的值加一,然后判断方法调用计数器的值与回边计数器的和是否已经超过了回边计数器的阙值,当超过阙值的时候,将会提交一个OSR编译请求,并且把回边计数器的值降低一些以便继续在解释器中执行循环,等待编译器输出编译结果。

与方法计数器不同,回边计数器没有热度衰减的过程,因此这个技术器统计的就是该方法循环执行的绝对次数,当计数器一溢出的时候,他会把方法技术器的值也调整到溢出状态,这样下次再进入该方法的时候,会执行标准编译过程。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值