解释器和编码器的工作方式

Time:2021-03-05 Author:admin

​    要了解计算机的工作方式,就要先了解什么是解释器和编译器,以及他们的工作方式。接下来,牛耳教育的小编就来给大家说一说,解释器和编码器的工作方式。

解释器和编码器的工作方式

   解释器

 

   传统的编译工具,主要分为字节码解释器和模版解释器。

 

   字节码解释器是在执行时通过纯软件代码模拟字节码的执行,效率低下;模版解释器则是主流使用的解释器,原理是将每一条字节码和一个模版函数关联,在Class字节码转成机器码的过程中会通过对应的模版函数生成对应的机器码,这样短期来看效率还不错,但是一旦同一个的字节码被多次执行,那么每次都需要通过模版函数生成机器码,效率十分低下。

解释器和编码器的工作方式

   即时编译器(JIT)

 

   JIT的原理是将字节码关联的模版数据直接转成机器码,然后将机器码缓存起来,后面如果再次执行这个字节码时就直接返回缓存中的机器码,省去了二次执行的时间,缺点是第一次的转换消耗比较长,所以以单次执行来看,JIT的效率是不如解释器的,但是一旦执行的字节码重复数多,JIT的作用就体现出来了。HotSpot中有两个JIT编译器,分别是ClientCompiler和ServerCompiler,但大多数情况下我们简称为C1编译器和C2编译器。C1进行简单的优化,耗时短。C2进行耗时长的优化,代码执行效率更高。实际中C1和C2共同协作执行的。

   实际过程

 

   当虚拟机启动时,解释器可以首先发挥作用,而不必等待即时编译器全部编译完成再执行,这样可以省去许多不必要的编译时间。并且伴随着程序运行时间的推移,即时编译器逐渐发挥作用,根据热点探测功能,将有价值的字节码编译为有价值的本地机器指令,以换取更高的程序执行效率。

解释器和编码器的工作方式

    热点代码探测的方式
 
    1、规定热点阀值。
 
    每次方法调用时该方法的调用次数都会+1,当调用次数达到阀值,就会触发JIT编译。热点阀值可通过-XX:CompileThreshold=来设定。
 
    如果不做任何设置,方法调用计数器统计的并不是方法被调用的绝对次数,而是一个相对的执行频率,即一段时间之内方法被调用的次数。当超过一定的时间限度,如果方法的调用次数仍不足以让它提交给JIT编译,那这个方法的调用计数器就会减少一半,这个过程称为方法调用计数器热度的衰减,而这段时间就称为此方法统计的半衰周期。
 
    可以使用-XX:-UseCounterDecay来关闭热度衰减,也可以使用-XX:CounterHalfLifeTime设置半衰周期的时间。
 
    2、回边计数器。
 
    统计一个方法中循环体代码执行的次数。在字节码中遇到控制流向后跳转的指令称为“回边”。显然,建立回边计数器统计的目的是为了触发OSR编译(JIT编译)。

   以上就是牛耳教育的小编为大家总结的关于解释器和编码器的工作方式。