一、类加载过程
.class文件最终加载到JVM并使用整体步骤及图示如下:
每个步骤所做的事情如下:
1、加载
(1)通过一个类的全限定名来获取该类文件的二进制字节流;(读取class文件到内存中)
(2)将字节流中的静态存储结构转化为方法区的运行时数据结构;(存到方法区)
(3)在内存堆中生成一个代表该类的java.lang.Class对象引用作为该类的访问入口。
2、验证
(1)文件格式验证:验证字节流是否符合class文件规范;
(2)元数据验证:验证字节码的是否符合java语法规范;
(3)字节码验证:验证字节流中的语义是合法的;
(4)符号引用验证:解析阶段验证直接引用和间接引用是否合法。
3、准备
(1)分配内存:根据类的成员属性分配内存;(比如:char类型分配2字节,int类型分配4字节...)
(2)赋初始值:为类的成员属性赋初始值。比如:成员变量private int a;成员变量a的初始值会被赋值为0。
4、解析:将间接引用转化为直接引用。比如:将Object obj = xxx;中的obj替换成此对象的在堆中的实际内存地址。
5、初始化:本质上是执行类构造器<clinit>()方法的过程,生成的静态变量和代码中定义的保持一致
(1)类构造器<clinit>()会手机所有变量的赋值动作(类成员赋值、静态代码块中的赋值)并进行赋值。
(2)初始化时,如果父类没有初始化则先初始化父类。当且仅当父类(接口除外)中定义的变量被使用时才出发父类的初始化。
6、使用/卸载