请简述JVM中类的加载机制 ?
参考答案:
Java虚拟机(JVM)的类加载机制是Java语言的一个重要特性,它负责动态加载Java类到JVM中。这个过程主要包括三个步骤:加载、链接(验证、准备、解析)和初始化。
-
加载:这是类加载过程的第一步,也是整个过程的入口。在这个阶段,JVM需要找到类的二进制数据,并按照JVM规范定义的格式存储在方法区中。这个二进制数据可以来自多种来源,如jar包、war包、网络下载等。
-
链接:链接阶段包含验证、准备和解析三个子阶段。
- 验证:验证是确保被加载的类文件符合JVM规范,无安全方面的问题。这包括文件格式验证、元数据验证、字节码验证和符号引用验证。
- 准备:准备是给类的静态变量分配内存,并设置默认的初始值。注意,这里的初始值是指数据类型的默认值,如int类型的默认值是0,boolean类型的默认值是false,而不是对象实例的初始化。
- 解析:解析是将符号引用转换为直接引用的过程。符号引用是在字节码中使用的,以一组符号来描述所引用的目标,而直接引用则是直接指向目标的指针。
-
初始化:初始化阶段是执行类构造器方法(
())的过程。此方法由编译器自动收集类中的所有类变量的赋值动作和静态代码块集合来的。类构造器方法对于类来说并不是必须的,如果一个类中没有静态变量也没有静态代码块,那么编译器就不会为这个类生成类构造器方法。
在JVM中,类的加载过程通常由类加载器(ClassLoader)来完成。类加载器按照特定的顺序和规则来查找和加载类。JVM默认提供了三种类加载器:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和系统类加载器(System ClassLoader)。它们之间形成了双亲委派模型,即当一个类加载器收到了类加载请求,它首先不会自己先去加载,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中。只有当父类加载器无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。
这种双亲委派模型的好处是可以避免类的重复加载,并且Java核心API中的类如java.lang.String等都是在启动类加载器中加载的,具有最高的优先级,保证了安全性。