0x01 类加载过程
加载
目的:class文件无论是通过文件、网络的形式获取都将转换成二进制流加载到内存中。
- 通过类的全限定名获取类的二进制流
- 将字节流代表的静态存储结构转换为
方法区
的运行时数据结构(此处的方法区涉及到java内存结构) - 在内存中生成一个代表该类的Class对象,作为
方法区
这个类的各种数据访问入口
在这里我们可以知道class文件被加载之后放在了内存结构中的方法区。同时jvm会自动实例化一个Class对象的实例,至于这个实例放在哪里,由具体的虚拟机决定,hotspot将其放在了方法区
验证
目的:确保class文件的字节流中包含的信息符合当前虚拟机要求,并且是安全的
从这个阶段可以看出,其实验证阶段是在加载阶段开始的时候就夹杂在其中开始了。
该阶段会进行如下验证:
- 文件格式验证:字节流是否符合Class文件格式规范
- 元数据验证:字节码描述的信息进行语义分析(对类、字段、方法等语言格式校验)
- 字节码验证:验证数据流和控制流,确定语义是符合逻辑的(if-else是不是跳错了)
- 符号引用验证:验证虚拟机将符号引用转换为直接引用是否出错(NoSuchMethod异常在这里会出现)
准备
目的:为类变量分配内存并设置类变量初始值(该初始值指的是对应类型的默认初始值,如int的默认初始值是0)