类加载是指将类的字节码文件加载到内存中,并在内存中创建一个对应的Class对象的过程。JVM的类加载机制主要包括以下几个步骤:
1.加载:将类的字节码文件加载到内存中。在加载阶段,JVM会根据类的全限定名,在classpath下查找并读取对应的字节码文件。
2.验证:验证被加载类的字节码文件的正确性和安全性。验证阶段主要包括文件格式验证、语义验证、字节码验证和符号引用验证等。
3.准备:为被加载类的静态变量分配内存,并设置默认初始值。在准备阶段,JVM会为每个类的静态变量分配内存空间,并初始化为默认值(如int类型的默认值为0)。
4.解析:将符号引用解析为直接引用。在解析阶段,JVM会将类、字段和方法的符号引用解析为直接引用,以便后续执行时可以直接调用。
5.初始化:执行类的初始化代码,包括静态变量的赋值和静态代码块的执行。在初始化阶段,JVM会执行类的初始化代码,对静态变量进行赋值,并执行静态代码块。
6.使用:使用加载、验证、准备和解析之后的类。在使用阶段,JVM可以通过直接引用调用类的方法和访问类的字段。
7.卸载:卸载不再使用的类。当一个类不再被引用时,JVM会将其从内存中卸载,释放资源。
JVM的类加载机制具有以下特点:
1.双亲委派模型:JVM使用双亲委派模型来加载类。即当一个类加载器收到类加载请求时,它会先将请求委派给父加载器处理,只有在父加载器无法完成加载时,才由子加载器尝试加载。
2.类加载器的层次结构:JVM中存在多个类加载器,它们按照层次结构组织,形成了一个加载器链。一般情况下,系统类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(Application ClassLoader)是JVM中最常见的三个类加载器。
3.命名空间隔离:每个类加载器都有自己的命名空间,同一个类加载器加载的类是相互可见的,不同类加载器加载的类是隔离的。这样可以实现类加载器的隔离性和安全性。
4.动态加载:JVM的类加载机制支持动态加载类。通过Class.forName()方法和ClassLoader.loadClass()方法,可以在程序运行期间动态加载类。
总结起来,JVM的类加载机制是通过加载、验证、准备、解析、初始化和使用等阶段,将类的字节码文件加载到内存中,并在内存中创建对应的Class对象。类加载器按照双亲委派模型组织,具有层次结构和命名空间隔离特点。类加载机制的灵活性和动态加载的支持,为Java程序提供了丰富的扩展和动态性。