ClassLoader工作机制——个人修炼

ClassLoader工作机制——个人修炼
最新回答
浅谈失去的回忆

2026-01-19 05:47:42

ClassLoader工作机制——个人修炼

ClassLoader,即类加载器,是Java虚拟机(JVM)用于动态加载类的一种机制。通过ClassLoader,JVM可以在运行时将类的.class文件中的二进制数据加载到内存中,并对其进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型。以下是ClassLoader工作机制的详细解析:

一、类的加载

类的加载指的是将类的.class文件中的二进制数据读入到内存中,并将其放在运行时数据区的方法区内,同时在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。这个Class对象提供了访问方法区内数据结构的接口。

  • 加载时机:JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,但如果该类一直没有被主动使用,则不会报告错误。类的主动使用包括创建类的实例、访问类的静态变量或静态方法、反射以及初始化子类等情况。
二、类的加载过程

JVM将类的加载分为装载(Load)、链接(Link)和初始化(Initialize)三个步骤。

1. 装载(Load)

装载是类加载过程的第一个阶段,主要完成以下任务:

  • 通过一个类的全限定名来获取其定义的二进制字节流。
  • 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
  • 在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区内这些数据的访问入口。

加载阶段完成后,虚拟机外部的二进制字节流就按照虚拟机所需的格式存储在方法区之中,并且在Java堆中也创建了一个java.lang.Class类的对象。

2. 链接(Link)

链接阶段又分为验证(Verify)、准备(Prepare)和解析(Resolve)三个步骤。

  • 验证:确保被加载的类的正确性。验证阶段包括文件格式验证、元数据验证、字节码验证和符号引用验证四个步骤,以确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。

  • 准备:为类的静态变量分配内存,并将其初始化为默认值。这些内存将在方法区中分配,且仅包括类变量(static),不包括实例变量。实例变量会在对象实例化时随着对象一起分配在Java堆中。

  • 解析:把类中的符号引用转换为直接引用。符号引用就是一组符号来描述目标,可以是任何字面量;而直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。

3. 初始化(Initialize)

初始化阶段是对类的静态变量、静态代码块执行初始化操作。JVM负责对类进行初始化,主要对类变量进行初始化。在Java中对类变量进行初始值设定有两种方式:声明类变量时指定初始值,或使用静态代码块为类变量指定初始值。

三、类的加载器

JVM的类加载是通过ClassLoader及其子类来完成的。ClassLoader的层次关系和加载顺序如下:

  • Bootstrap ClassLoader:负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class或Xbootclassoath选项指定的jar包。由C++实现,不是ClassLoader子类。

  • Extension ClassLoader:负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包。

  • App ClassLoader:负责加载classpath中指定的jar包及-Djava.class.path所指定目录下的类和jar包。

  • Custom ClassLoader:通过java.lang.ClassLoader的子类自定义加载class,属于应用程序根据自身需要自定义的ClassLoader,如Tomcat、JBoss等都会根据J2EE规范自行实现ClassLoader。

加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个ClassLoader已加载,就视为已加载此类,保证此类只被所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。

四、类的生命周期结束

在如下几种情况下,Java虚拟机将结束类的生命周期:

  • 执行了System.exit()方法。
  • 程序正常执行结束。
  • 程序在执行过程中遇到了异常或错误而异常终止。
  • 由于操作系统出现错误而导致Java虚拟机进程终止。
总结

ClassLoader工作机制是Java虚拟机实现动态加载类的重要机制。通过理解ClassLoader的加载过程、加载器层次关系和类的生命周期管理,可以更好地掌握Java程序的运行原理,并在实际开发中灵活运用ClassLoader进行类的动态加载和管理。

以上图片展示了类的加载过程和类的加载器层次关系,有助于更直观地理解ClassLoader的工作机制。