Java JIT(编译器)

2019-08-16  本文已影响0人  觉悟吧骚年

概念

JVM在解释执行字节码的过程中会收集代码块或方法的执行频率用于判断该代码块或方法是否为热点代码,如果被判定为热点代码则这些代码在运行时会被编译并优化成与本地平台相关的可被cpu直接执行的机器码。这种编译过程称为JIT(即时编译),执行JIT的模块被称为JIT编译器。

谁被编译

触发条件(热点探测方法)

HOTSPOT虚拟机(基于计数器的热点探测)

  1. 方法调用计数器(Invocation Counter)
    • 默认触发阈值:在Client模式下是1500次,Server是10000次,可以通过参数-XX:CompileThreshold来设定
    • 当一个方法被调用时会首先检查是否存在被JIT编译过得版本,如果存在则使用此本地代码来执行;如果不存在,则将方法计数器+1,然后判断“方法计数器和回边计数器之和”是否超过阀值,如果是则会向编译器提交一个方法编译请求
    • 默认情况下,执行引擎并不会同步等待上面的编译完成,而是会继续解释执行。当编译完成后,此方法的调用入口地址会被系统自动改写为新的本地代码地址
    • 还有一点,热度是会衰减的,也就是说不是仅仅+,也会-,热度衰减动作是在虚拟机的GC执行时顺便进行的
  2. 回边计数器(Back Edge Counter)
    • 只有执行到大括号”}”时才算+1
    • 默认阀值:Client下13995,Server下10700
    • 它的调用逻辑和方法计数器差不多,只不过遇到回边指令时+1、超过阀值时会提交OSR编译请求以及这里没有热度衰减

编译器(Hotspot JVM)

编译模式(Hotspot JVM)

编译过程

编译过程是在后台线程(daemon)中完成的,可以通过参数“-XX:-BackgroundCompilation”来禁止后台编译,但此时执行线程就会同步等待编译完成才会执行程序。

参考文章 https://www.jianshu.com/p/b1a33c94cd93

上一篇 下一篇

猜你喜欢

热点阅读