16.编译过程
概述
在默认设置下,无论是方法调用产生的即时编译请求,还是OSR编译请求,虚拟机在代码编译器还未完成之 前,都仍然将按照解释方式继续执行,而编译动作则在后台的编译线程中进行。
-XX:-BackgroundCOmpilation来禁止后台编译,在禁止后台编译后,一旦达到JIT的编译条件,执行线程向虚拟机提交编译请求后将会一直等待,直到编译过程完成后再开始执行编译器输出的本地代码。
Client Compiler
Service Compiler和Client Compiler两个编译器的编译过程不一样。对于Client Compoiler来说,它是三段式编译器,主要的关注点在于局部性的优化,而放弃了许多耗时较长的全局优化手段
- 一个平台独立的前端将字节码构造成一种高级中间代码表示。HIR使用静态分配的形式来代表代码值,这可以使得一些在HIR的构造过程之中和之后进行的优化动作更容易实现。在此之前编译器会在字节码上完成一部分基础优化,如方法内联、常量传播等优化将会在字节码被构造成HIR之前完成。
- 一个平台相关的后端从HIR中产生低级中间代码表示,而在此之前会在HIR上完成另一些优化,如空值检查消除、范围检查消除等,以便于让HIR达到更高效的代码表示形式。
- 最后阶段是在平台相关的后端使用限行扫描算法在LIR上分配寄存器,并在LIR上做窥孔优化,然后产生极其代码。
具体流程图如下:
Server Compiler
是专门面向幅度按的典型应用并为服务端的性能配置特别调整过的编译器,也是一个充分优化过的高级编译器,机会能达到GNU C++编译器使用-02参数时的优化强度,它会执行所有景点的优化动作,如无用代码消除、消除公共子表达式、常量传播、基本快重排序等。还会实施一些与Java语言特性密切关系的相关的优化技术,如范围检查消除、空值检查消除等。
有志不在年高,无志空长百岁。