验证阶段
- 连接(Linking)阶段的第一个环节是验证, 验证的主要目的是检测java字节码文件是否遵守了《Java虚拟机规范》中的约束。这个阶段一般不需要程序员参与。
- 主要包含如下四部分 ,具体详见《Java虚拟机规范》:
- 文件格式验证 , 比如文件是否以 0xCAFEBABE开头, 主次版号是否满足当前虚拟机版本
- 元信息验证, 例如类必须有父类(super不能为空)
- 验证程序执行指令的语义, 比如方法内的指令执行到一半强行跳转到其他方法去
- 符号引用验证, 例如是否访问了其他类中private的方法等
准备阶段
- 准备阶段为静态变量(static)分配内存并设置初始值
- 准备阶段只会给静态变量赋值初始值, 每一种基本数据类型和引用数据类型都有其初始值
- final修饰的基本数据类型的静态变量, 准备阶段直接会将代码中的值进行赋值
解析阶段
- 解析阶段主要是将常量池中的符号引用替换为直接引用
- 符号引用就是在字节码文件中使用编号来访问常量池中的内容
— 直接引用不再使用编号, 而是使用内存中地址进行访问具体的数据