从原理聊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技术仅替换循环代码体的入口,解决方法优化后需等待下次调用的问题。
➡️