JVM - 1 - 源文件编译过程

Posted hpzhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM - 1 - 源文件编译过程相关的知识,希望对你有一定的参考价值。

前言

  简单的针对JAVA虚拟机(JVM)相关知识做一个总结,从此章开始这是一个系列文章,包括内容有;

    1 前端编译,AOT(静态编译),JIT即时编译

    2 字节码文件的结构,类加载机制以及运行时内存区域

    3 关于对象的创建,内存的分配,访问的定位,判断对象是否可用,内存的回收

    4 对象内存分配及垃圾回收策略以及垃圾回收算法

    5 JVM执行引擎

    6 JVM提供的性能监控与故障处理工作,常用的JVM参数配置

  

本章内容

  注意:编译过程分为两个部分,运行前编译,以及运行时编译,运行前编译是在JVM工作开始前的操作,本章即介绍此部分

  说明:编译过程包括(语法,词法,语义的具体分析),这里只是简单的介绍编译器的工作流程,没有深入的去分析

 

知识点

  1 前端编译

  2 AOT(静态代码)编译

 

前端编译 (将源代码编译成字节码 例如:javac)

  1 编译过程

    1.1 解析与填充符号表(词法分析和语法分析)

      词法分析将源代码转换成Token(标记),语法分析再根据token构造出抽象语法树,然后根据词法分析之后的结果填充符号表

    1.2 插入式注解处理

      可以实现在编译期间对注解进行处理,通过实现插入式注解器可以访问和修改抽象语法树中的任意元素.如果一个插入式注解处理器修改了抽象语法树,则在修改语法树之后回到解析与填充符号表的过程重新处理

    1.3 分析与生产字节码 (对生成的抽象语法树进行语义分析,然后生成字节码)

      1.3.1 标注检查

           变量使用前是否声明,变量类型是否匹配等.常量折叠

      1.3.2 数据与控制流分析

           检查程序的上下文逻辑是否正确 包括:方法是否每条执行路径都有返回值,异常是否被抛出或者被catch等

      1.3.3 解语法糖

           泛型,自动装箱拆箱,变长参数,for-each循环,断言语句等,这些语法糖在编译期都会被还原成简单的基础语法

  2 优点

    2.1 编译成的Class文件可以直接给JVM解释器解释执行,省去编译时间,加快启动速度

    2.2 许多java语法新特性(语法糖:泛型,内部类等等),是靠前端编译器实现的,而不是依赖虚拟机

  3 缺点

    3.1 对代码运行效率几乎没有任何优化措施

    3.2 解释执行效率较低 

  

AOT(静态代码)编译 (程序运行期,直接把源文件编译成本地机器码 例如:JAOTC,GCJ,ART等)

  1 优点

    1.1 程序运行前,直接把java源文件(.java)编译成本地机器码的过程 (JAOTC,GCJ,ART等)

    1.2 把编译的本地机器码保存磁盘,不占用内存,并可多次使用

  2 缺点

    因为java语言的动态性带来了额外的复杂性,影响了静态编译代码的指令

 



以上是关于JVM - 1 - 源文件编译过程的主要内容,如果未能解决你的问题,请参考以下文章

JVM:文件编译过程

java --代码编译和执行的整个过程

java之JVM学习--简单理解编译和运行的过程之概览

类加载的执行过程

Day336.执行引擎 -JVM

深入理解JVM读书笔记四: (早期)编译器优化