简述描述一下JVM加载class文件的原理机制? ?
参考答案:
JVM(Java Virtual Machine,Java虚拟机)加载class文件的原理机制可以大致分为以下三个步骤:
-
加载(Loading):
- 加载是类加载过程的一个阶段,在这个阶段,JVM需要找到并加载类的二进制数据。
- JVM主要通过三种方式来加载类:从文件系统加载、从网络加载、从zip包或jar包等归档文件中加载。
- JVM通过类的全名(包括包名)来获取定义此类的二进制字节流。
- 一旦一个类被加载到JVM中,同一个类就不会再次被加载。
-
链接(Linking): 链接是类加载过程的核心部分,它又可以分为以下三个子阶段:
- 验证(Verification):验证阶段是为了确保被加载的类文件符合JVM规范,没有安全方面的问题。
- 准备(Preparation):准备阶段是正式为类的静态变量分配内存,并设置默认的初始值。
- 解析(Resolution):解析阶段是将符号引用转换为直接引用。符号引用是一个字符串,它表示了某个类的成员或方法;而直接引用则是一个指向内存地址的指针。
-
初始化(Initialization):
- 初始化阶段是执行类构造器方法(
())的过程。此方法由编译器自动收集类中的所有类变量的赋值动作和静态代码块集合而成。 - 初始化阶段是类加载过程的最后一步,之前的类变量赋值动作和静态代码块都将在此时执行。
- 初始化阶段是执行类构造器方法(
在JVM中,类加载器(ClassLoader)负责加载class文件。类加载器之间具有父子关系,这种关系通常是通过组合关系(使用父类加载器)来实现的,而不是通过继承关系。当请求加载一个类时,类加载器会首先检查这个类的字节码文件是否已经被加载过,如果尚未加载,系统会初始化一个新的类。类的加载过程需要类加载器参与,但JVM规范并没有规定一定要由类加载器来完成,也就是说,开发者可以直接调用定义在java.lang.ClassLoader类中的方法来完成加载类的任务。
此外,JVM还提供了双亲委派模型,这是类加载器加载类时的一个核心策略。当一个类收到了类加载请求,它不会自己先去加载,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中。只有当父类加载器无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。
这就是JVM加载class文件的原理机制。