从原理聊JVM(五):JVM的编译过程和优化手段

💡 原文中文,约3800字,阅读约需9分钟。
📝

内容提要

前端编译将Java源码编译成Class文件,包括准备、解析与填充符号表、注解处理器和分析与字节码生成。运行时编译将代码编译成本地代码,JVM先解释执行再根据热点探测编译热点代码。编译模式有client compiler和server compiler,client compiler包括方法内联、去虚拟化和冗余消除,server compiler包括逃逸分析、标量替换、栈上分配和同步削除。OSR在循环代码体部分执行编译后的机器码。

🎯

关键要点

  • 前端编译将Java源码编译成Class文件,分为准备、解析与填充符号表、注解处理器和分析与字节码生成四步。

  • 准备阶段初始化插入式注解处理器。

  • 解析与填充符号表将源代码转变为标记集合,构造抽象语法树,符号表存储变量名、函数名等信息。

  • 注解处理器作为编译器插件,执行特定逻辑并生成代码,修改语法树后需重新解析。

  • 分析与字节码生成阶段包括标注检查、数据及控制流分析、解语法糖和字节码生成。

  • 运行时编译将代码编译成本地代码,JVM先解释执行再编译热点代码。

  • Sun JDK根据方法调用计数器和回边计数器决定何时进行编译执行。

  • 编译模式分为client compiler和server compiler,client compiler轻量级,server compiler进行全局优化。

  • client compiler的优化包括方法内联、去虚拟化和冗余消除。

  • server compiler的优化包括逃逸分析、标量替换、栈上分配和同步削除。

  • OSR技术仅替换循环代码体的入口,解决方法优化后需等待下次调用的问题。

➡️

继续阅读