Jvm编译与程序优化

Jvm编译与程序优化 此花亭奇谭

关于编译

编译的过程
.java - 解析&填充符号表 - 注解处理 - 分析字节码生成 - .class

  • 解析与填充符号表 1.词法、语法分析 敌法分析师将源码中的字符流转变为标记(Token)集合,单个字符是程序编写的最小元素
    int a = b + 2 -> 6个标记
    

    语法分析是根据Token序列构造抽象语法树的过程
    2.填充符号表
    符号表是由一组符号地址与符号信息构成的表格,类似k-v对,符号表中等级的信息在编译不同阶段都要用到,作用是语义检查和产生中间代码

  • 注解处理器 通过注解处理器,允许我们通过代码干涉编译器的行为

  • 语义分析与字节码生成
    int a = 1; boolean b = false; char c = 2;
    int d = a + c; 只有这个能通过编译
    int d = b + c;
    char d = a + c;
    

    1.标注检查
    语法分析分为标注检查 & 数据控制流分析
    标注检查主要是检查变量是否被声明,赋值数据类型是否能匹配,还有常量折叠

    int a = 1 + 2;常量折叠后,将会被折叠为字面量3;
    a = 1 + 2 与 a = 3在运行期并没有增加cpu指令的运算量
    

    2.数据控制流分析
    对程序上下文逻辑进一步验证,检查变量使用前是否赋值、每条路径是否有返回至、是否异常都被正常处理等

    public void foo(final int arg){
      final int var = 0
    }
    与
    public void foo(int arg){
      int var = 0
    }
    编译后在class内两个是一致的,在编译阶段就已经做了赋值检查,对运行期没有影响
    

    3.解语法糖
    4.字节码生成
    将前面各步骤的信息转化为字节码写到磁盘,还有少量代码添加和转换(例如()和())
    完成对语法树遍历和调整后,最终会输出Class文件,结束编译

关于语法糖