本文参考自来自周志明《深入理解Java虚拟机(第2版)》,拓展内容建议读者可以阅读下这本书。

文字版如下:

编译期优化

javac的编译过程

解析和填充符号表

  • 解析 Parse

    • 词法分析

      • 源代码字符流 -> 标记Token
      • 源代码字符是程序编写的最小单位,Token是编译过程的最小元素不可再分
    • 语法分析

      • Token序列 -> 抽象语法树AST
      • AST描述代码语法结构的树状结构,每个节点表示一个语法结构(包、类型、修饰符、运算符、接口、返回值、注释等)
  • 填充符号表 Enter

    • 符号表 -> 待处理列表To Do list
    • 符号表symbol table是由一组符号地址和符号信息构成的表
    • 包、类、方法、字段都可以抽象成一个符号(symbol),不同种类的符号之间可以有包含嵌套关系,这一阶段的任务就是识别出各类符号,并对不同种类的符号按照包含嵌套关系进行归类,并挂接到AST对应的结点上。

插入式注解处理器的注解处理

  • 使用JDK1.6后提供的插入式注解标准API来开发,这些API用于读取、修改、添加语法树的元素,运行时使用-processor参数来参与javac的编译
  • 插入式注解处理器起编译期插件作用
  • 在编译期间插入式注解处理器对注解进行处理,可以读取、修改、添加语法树的元素
  • 如果处理过程中修改了语法树将会触发编译期回到填充符号表阶段重新处理一轮(Round),直到语法树不再变化
  • 实例:lombok,在设置了相关注解后lombok会在编译期生成源代码中没有的方法等

分析与字节码生成

  • 语义分析

    • 标注检查

      • 变量使用前是否已经被声明
      • 变量与赋值之间的数据类型是否能够匹配
      • 常量折叠
    • 数据及控制流检查

      • 程序局部变量在使用前是否有赋值
      • 方法的每条路径是否都有返回值
      • 是否所有的受检异常都被正确处理
      • final参数、final局部变量是否被修改

        • 局部变量是否用final修饰最终在class文件中是无差别的,因为局部变量在class中是没有访问标志的,这个final不变性只在编译期检查时保证
    • 解语法糖

      • 泛型:编译后发生类型擦除,但是编译信息会保留Signature
      • 变长参数:编译后变成数组类型的参数
      • 自动装箱拆箱:编译后装箱通过valueOf()变成了对象,拆箱通过xxxValue()变成了原始类型值
      • 遍历循环:编译后变成了迭代器遍历
      • 条件编译:编译后将常量不可达条件分支直接消除掉
      • 内部类
      • 枚举类
      • 断言
      • switch处理枚举和字符串
      • try定义和关闭资源
  • 字节码生成

    • 处理完的语法树和符号表 -> 字节码
    • 少量的代码添加和转换工作

      • 添加<init>()和<clinit>()方法

        • <init>()收敛的操作

          • 调用父类的<init>()
          • 执行{}语句块
          • 初始化实例变量
        • <init>()是字节码级别的方法,对使用者是透明的,与每个<init>()对应的构造方法是源码级别的方法,是真正被使用者开放的。<init>()和构造方法一一对应,是同一概念在两个级别的含义
        • <clinit>()收敛的操作

          • (JVM自动保证执行父类的<clinit>())
          • 执行static{}语句块
          • 初始化类变量
      • 字符串加操作替换为StringBuffer或StringBuilder的append()操作

Java编译期优化思维导图相关推荐

  1. Java基础编程及思维导图整理

    我把Java基础编程及思维导图整理的超级详细,小白都能看懂 Java基础编程及其思维导图 目录: Java学习导图 一.Java基本语法 1.关键字与标识符 2.变量分类 3.运算符 4.流程控制 二 ...

  2. Java基础编程及思维导图

    java基础编程及其思维导图 感谢尚硅谷宋红康老师 java学习导图 一.java基本语法 1.关键字与标识符 2.变量分类 3.运算符 4.流程控制 二.数组 1.数组概述 2.一维数组 3.二维数 ...

  3. 吐血整理的 Android 性能优化思维导图,让面试官眼前一亮

    引言 现如今 Android 开发行业的主要问题是因为初级的 Android 开发者太多了,导致初级开发的市场过于饱和,所以也就进一步导致初级和中级的开发者面临更大的竞争,因此想要脱离这种竞争现状,只 ...

  4. Java最全的思维导图汇总!速度收藏!

    经过3个月一边整理一边复习,把许多知识都系统的进行梳理了一遍,很有融会贯通的感觉!各种面试题,在自己作答之后又参考了许多大佬的解答,学了很多大佬的思维方式.前段时间,集中进行了几轮面试,有阿里钉钉.字 ...

  5. [Java 并发] Java并发编程实践 思维导图 - 第一章 简单介绍

    阅读<Java并发编程实践>一书后整理的思维导图.

  6. 网站性能优化思维导图

    前言 下面是看了大神的笔记做的思维导图,纯为整理 参考网站 juejin.im/post/5b6fa8- www.cnblogs.com/xianyulaodi- 性能优化 雅虎35条军规

  7. java类与接口思维导图_详解java接口基础知识附思维导图

    接口: 官方的含义是---->java接口是一系列方法的声明,是一些方法特征的集合 疑问: 那为什么不用抽象类呢?把他们共有的方法集合起来放在一个抽象类里面,同样可以调用哇,但是反过来想一想如果 ...

  8. 最新Java学习资料与思维导图分享,免费领取!

    很多学 Java 的同学时常会发现,在校时学了一套东西,到大公司面试时又是另一套东西. 其实,归根结底,还是本人缺少真正的实战经验,这里整理了一份系统化学习的思维导图(完整版文末领取),大家查漏补缺, ...

  9. 【JavaSE03】Java中分支语句-思维导图

    思维导图看不清楚时: 1)可以将图片另存为图片,保存在本地来查看 2)右击在新标签中打开放大查看 if语句 a) if语句 基本语法结构: if(关系表达式) { 基本语句体 } 执行流程: 首先判断 ...

最新文章

  1. Docker中操作镜像和容器的常用命令
  2. 玩物得志Java笔试题_代码规范利器-CheckStyle
  3. java holdslock_一种检测Java并发程序代码分支路径lock是否遗漏的方法
  4. Elasticsearch启动报错:Exception in thread “main“ java.nio.file.AccessDeniedException:
  5. HDU4026 Unlock the Cell Phone [状态压缩DP]
  6. Pytorch专题实战——激活函数(Activation Functions)
  7. Android学习(五)—— Android初级控件
  8. 算法笔记_面试题_7.颜色分类/荷兰三色旗问题
  9. Atitit 项目战略之道 attilax著
  10. [Other] Inno Setup 使用心德-一个完整的项目 包括.NET组建捆绑 去空格等
  11. 魅族一直显示无服务器,魅族手机用久了卡顿,这三个方法轻松解决
  12. 卷毛机器人抢大龙_LOL:机器人史诗级加强,如果他还没退役,SKT都不敢放机器人...
  13. mybatis 的trim标签的使用,属性prefix,suffix,prefixOverrides,suffixOverrides
  14. mac调整启动台图标
  15. 第19章 特殊工具与技术【C++】
  16. JRE和JDK的区别?
  17. linux启动程序镜像构建_启动人员分析功能3个构建块
  18. macbookpro和macbookair哪个好些?
  19. 女生转行程序猿,到底难不难?
  20. 使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件

热门文章

  1. SignalTap II里面Power-Up Trigger的使用
  2. jQuery碎语(2) 事件
  3. Safari导入Chrome书签
  4. Java getResourceAsStream返回为空的问题
  5. 同一个项目,项目名称不一致,这两个项目同时在Eclipse中出现
  6. 一个对于小数四舍五入的算法C语言版
  7. swapLexOrder
  8. 【ROS学习笔记】(三)发布者Publisher的实现
  9. drools规则拼接_Drools-规则层次结构和条件执行
  10. 路径压缩_实战|python GUI压缩小程序