- 加载(Loading):通过类加载器(ClassLoader)查找并加载字节码文件(.class文件)。类加载器根据类的全限定名来定位字节码文件。
- 验证(Verification):对加载的字节码文件进行验证,确保其符合JVM规范。验证过程包括文件格式验证、元数据验证、字节码验证和符号引用验证等。
- 准备(Preparation):为类的静态变量(被static修饰的变量)分配内存空间,并设置初始值。非静态变量(实例变量)会在对象实例化时分配内存空间并设置初始值。
- 解析(Resolution):将符号引用(Symbolic Reference)替换为直接引用(Direct Reference)。符号引用包括类和接口的全限定名、字段和方法的名称等。
- 初始化(Initialization):执行类的初始化代码,包括静态变量的赋值和静态代码块的执行。初始化过程是类加载的最后一步,且是线程安全的。
- 使用(Usage):使用已加载和初始化的类创建对象并调用类的方法。
值得注意的是,JVM使用了延迟加载(Lazy Loading)的策略,即只有在需要使用某个类时才会进行加载和初始化。同时,JVM还提供了类的卸载(Unloading)机制,当某个类不再被使用时,JVM会将其从内存中卸载。