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 - 源文件编译过程的主要内容,如果未能解决你的问题,请参考以下文章