_StriveG Blog

jvm编译器优化

前言

深入理解java虚拟机

java是编译运行的,因此,在运行之前,会进行编译操作。在java中,有三种类型,如下:

  • 前期编译器:将.java编译成.class,常见的如javac
  • JIT编译器(just in time compiler):将.class字节码转化为机器码,如hotspot的C1,C2
  • AOT编译器(Ahead Of Time Compiler):将.java文件直接转化为机器码的过程

javac的编译过程

javac的编译过程分为下面三个步骤:

  • 解析与填充符号表的过程
  • 插入式注解处理器的注解处理过程
  • 分析与字节码生成过程

解析与填充符号表的过程

解析过程包括词法分析与语法分析两个过程。

  • 词法分析 词法分析是将源代码的字符流转化为标记(Token)集合,标记是编译过程中的最小元素、关键字、变量名、字面量、运算符等都可以成为标记
  • 语法分析 是根据token生成抽象语法树的过程

注解处理器

这个过程就是处理我们编译时注解的过程。

语义分析与字节码生成

  • 语义分析
    1. 标注检查,检查的内容包括变量使用前是否已被申明、变量与赋值过程的类型是否匹配等,在这个过程中,会进行一个重要的操作,叫做常量折叠,如 int A = 1 + 2,编译成 int A = 3
    2. 数据及控制流分析,对程序上下文逻辑更进一步的验证,检查程序局部变量在使用前是否有赋值、方法的每条路径是否有返回值等等问题。
      1. 解语法糖,包括自动拆箱、装箱等
  • 字节码生成 将前面各个步骤生成的信息,写入到磁盘中。

Java中语法糖

  • 泛型与类型擦除,讲ArrayList,ArrayList擦除程同一种类型
  • 自动装箱、拆箱与遍历循环
  • 条件编译 如果发现只会为true,或者false,只会编译对应分支。

参考资料

来自经典好书 深入理解java虚拟机。建议入手一本,

最近访客