java解释和jit编译
2018-07-10 本文已影响16人
蒸汽飞船
Just In Time即时编译器。当JVM发现某个方法或代码块运行频繁时,就会把这段代码认定为热点代码,通过JIT在运行时将这些代码编译成本地机器码,并进行相关优化。
在JIT未出现之前,字节码指令被解释器转译成对等的微处理器指令,并根据转译后的指令先后顺序依次执行,由于一个Java指令可能会被转译成十几或几十个对等的微处理器指令,这种模式执行的速度特别慢。
基于这种瓶颈,JIT技术应运而生了。对于需要使用JIT进行编译的字节码指令,相对于使用解释器来解释执行的方式来说,JIT只需要额外花费少许的编译时间,就可以提高代码执行的效率,节省执行时间。但是对于执行次数少的指令,也采用JIT进行编译则编译时额外花费的时间,加上执行的时间,不比解释执行的时间短。
基于解释器和即时编译器各自有其适应的优势特点,将两者集合起来,就是所谓的动态编译器dynamic compiler。动态编译器具体做法为,使用JIT执行热点字节码指令(被多次调用的方法或循环体的字节码指令),使用解释器执行非热点代码)。而至于热点字节码的判定,目前有两种算法,一种是基于采样的热点探测(周期性地检查各个线程的栈顶,经常出现在栈顶的方法代码就是热点代码),一种是基于计数器的热点探测(每个方法或其中的代码块对应有一个计数器,用来统计执行的次数,当执行次数超过一定阈值时则被认为是热点方法)。HotSpot虚拟机使用的是基于计数器的热点探测方法,它为每个方法准备了两个计数器,分别用于探测方法的调用次数和方法中循环体代码执行的次数,当计数器的值超过了阈值,则会触发JTI编译。触发了JIT编译后的代码,并不会停下来等待JIT编译完,而是继续解释执行,JIT编译的机器码等到下一次调用该方法或代码时才会被使用。