你真的了解java编译优化吗?15个问题考察自己是否理解

本文详细介绍了Java的早期和晚期编译优化过程,包括词法分析、语法分析、符号表填充、注解处理、语义分析、字节码生成、解释器和编译器的作用,以及晚期优化措施如热点代码、冗余访问消除、公共子表达式消除等。通过15个问题帮助读者检验对Java编译优化的理解,并对比了Java与C++的编译和运行差异。
摘要由CSDN通过智能技术生成

【摘要】 早期编译过程 晚期编译优化 jvm编译优化学习笔记 早期 第一步: -------词法分析: -------语法分析(注意实际上只是生成一个语法树,还没做语法的校验): -------填充符号表: 第二步: -------注解处理器: 第三步: -------语义分析: -------解语法糖: -------字节码生成: 晚期 解释器Interperter 编译器 晚期优化的一些常见措施...

  1. 早期编译过程
  2. 晚期编译优化
  3. jvm编译优化学习笔记
    1. 早期
      1. 第一步:
        1. -------词法分析:
        2. -------语法分析(注意实际上只是生成一个语法树,还没做语法的校验):
        3. -------填充符号表:
      2. 第二步:
        1. -------注解处理器:
      3. 第三步:
        1. -------语义分析:
        2. -------解语法糖:
        3. -------字节码生成:
    2. 晚期
      1. 解释器Interperter
      2. 编译器
    3. 晚期优化的一些常见措施(即运行中才会做优化的步骤)
      1. ----热点代码
      2. —冗余访问消除:
      3. ----公共子表达式消除
      4. —数组边界检查:
      5. —隐式异常处理:
      6. ----方法内联:
      7. ----逃逸分析:
      8. ----java和C++, 即时编译和静态编译的区别:

首先提出一个问题,为什么C++的编译速度会比java慢很多?二者运行程序的速度差异在哪? 了解了java的早期和晚期过程,就能理解这个问题了。

这里会提15个问题确认是否真的理解,如果完全没这方面的概念,则好好看一下文章末尾的“jvm编译优化笔记”章节。

早期编译过程


Q: java早期编译过程分为哪3步?
A:

  1. 词法语法解析、填充符号表
  2. 注解处理
  3. 语义分析与字节码生成。

Q: 上面的步骤中, 符号表是干吗的?
A:
符号表是符号地址和符号信息构成的表格。

  • 用于后面阶段做语法检查时,从表里取出信息进行对比。
  • 符号表是目标代码生成时的地址分配的依据

Q: 注解处理器做的什么事情?
A: 注解处理器会扫描抽象语法树中带注解的元素, 并进行语法树的更新。
重点就是他是基于语法树做更新。
更新之后我们会重新走回解析与填充的过程,重新处理。


Q: 上面的3个步骤中, 解语法糖是哪一步?
A:
是第三步,在生成字节码的时候才做的语法糖处理。


Q: 什么是解语法糖?大概有哪些?
A:

  • 虚拟机本身不支持这种语法, 但是会在编译阶段 把这些语法糖转为 普通的语法结构。
  • 包含自动装拆箱、 泛型强转应用。

Q: 生成字节码class文件的时候, final和非final的局部变量, 会有区别不?
A:
没有区别。
局部变量不会在常量池中持有符号引用, 所以不会有acesses_flasg信息。
** 因此final局部变量在运行期没有任何作用, 只会在编译期去校验。**


Q: a= 1 + 2会在什么阶段进行优化?
A: 会在早期编译过程的语义分析过程中,进行常量折叠, 变成a=3
同理, 字符串+号优化成stringBuilder.app

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值