1、加载(Loading):
通过类的完全限定名,JVM会查找此类的二进制字节码文件(通常是.class文件)。
将找到的二进制字节码文件加载到JVM中,并在堆中创建对应的Class对象。这个Class对象包含了类的元数据信息(如类的名称、字段、方法等)。
2、链接(Linking):
链接过程包括三个阶段:验证、准备和解析。
1、验证(Verification):
(1)确保Class文件符合虚拟机规定的Class文件格式。
(2)包括文件格式验证、元数据验证、字节码验证和引用符号验证。
(3)检查类的结构、语义、字节码和二进制兼容性。
2、准备(Preparation):
(1)为类的静态变量分配内存并设置初始化值。
(2)对于对象类型的静态变量,赋值为null;对于基本数据类型的静态变量,赋值为默认值(如0、false等)。
(3)需要注意的是,如果是final修饰的静态变量,则在准备阶段就已经完成赋值。
3、解析(Resolution):
(1)将常量池中的符号引用转换为直接引用。
(2)解析过程可能包括字段解析、接口解析和方法解析。
(3)符号引用是声明性的引用,而直接引用是地址或句柄的引用。
3、初始化(Initialization):
1、初始化静态变量和静态块。
2、如果类有父类,先初始化父类,再初始化当前类。
3、只有对类主动使用时(如实例化对象、读取和设置类的静态变量、调用静态方法等)才会进行初始化。
4、使用(Using):
1、在程序代码执行时,使用已加载和初始化的类。
2、通过new关键字创建类的实例,或在代码中调用类的方法。
5、卸载(Unloading):
1、当类不再被使用,并且满足垃圾回收的条件时,JVM会卸载这个类。
2、卸载过程会回收类在内存中占用的空间。
需要注意的是,类的加载、链接和初始化过程是按顺序进行的,但解析阶段在某些情况下可能在初始化阶段之后开始,因为Java支持运行时绑定。此外,类的加载时机由JVM的类加载器根据需要进行控制。