概述
在阅读深入理解java虚拟机这本书时,觉得作者写得很好,看了有很多收获,同时也发现了一个问题,就是作者并没有完整的按照一个java程序从java文件到最后运行结束做出一个整体的分析。
事实是一般java程序员做的开发工作往往仅局限于java文件,即写java代码本身。那么一个java文件从写好开始,会经历哪些过程呢?我想借由这篇文章来做一个大致梳理。
编译
由java程序员写好后的代码是存放在一个个的java文件。那么第一步就是把这个java文件编译成一个class文件。
然而事实上编译期在java里面远远不止是这么简单。java语言的编译期是一段不确定的过程,包括
- 编译器的前端。把java文件转变成class文件。
- 后段运行期编译。JIT编译器,把字节码转变成机器码的过程。
- 静态提前编译。AOT编译期,直接把java文件编译成本地机器代码。
编译过程大致可以分为三个过程:
- 解析与填充符号表过程
- 词法,语法解析
- 填充符号表
- 插入式注解处理器的注解处理过程
- 分析与字节码生成过程
- 标注检查
- 数据及控制流分析
- 解语法糖
- 字节码生成
加载
把描述类的数据从Class文件(已经编译成Class文件了)加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的java类型.
.class文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载
解释或编译运行class中的字节码指令
一些问题
1.假设一个java文件有5个类,编译后有几个class文件?
答:有几个类就有几个Class文件