2026-10-25 23:54:30
JVM的双亲委派机制是一种自底向上的类加载器委托机制,其核心逻辑是:除启动类加载器外,其他类加载器在尝试加载类时,会优先将请求委托给父类加载器处理,若父类加载器无法完成加载,子类加载器才会自行加载。
一、双亲委派机制的核心原理类加载器层次结构
启动类加载器(Bootstrap ClassLoader):由C++实现,负责加载JVM核心类库(如java.lang、java.util等),位于<JAVA_HOME>/jre/lib目录下的核心类文件(如rt.jar)。
扩展类加载器(Extension ClassLoader):由Java实现,继承自ClassLoader,负责加载<JAVA_HOME>/jre/lib/ext目录下的扩展类库。
应用程序类加载器(Application ClassLoader):默认的类加载器,负责加载用户类路径(CLASSPATH)下的类文件。
自定义类加载器:开发者可通过继承ClassLoader实现自定义加载逻辑,通常用于加载非标准路径的类。

委派流程
当某个类加载器收到类加载请求时,不会直接尝试加载,而是将请求向上委托给父类加载器。
父类加载器重复此过程,直至请求到达启动类加载器。
若启动类加载器无法加载(如类不在核心库中),则逐级向下返回,由最初请求的类加载器尝试加载。
避免类重复加载通过层次化委托,确保同一类仅由一个类加载器加载,防止内存中存在多个相同类实例。例如,java.lang.String始终由启动类加载器加载,即使应用程序中存在同名类,也不会被加载。
保障类安全性核心类库(如java.lang.Object)由启动类加载器优先加载,防止恶意代码通过自定义类加载器替换系统核心类,从而破坏JVM安全。例如,若允许自定义java.lang.String,可能导致字符串操作被篡改。
维护类命名空间隔离不同类加载器的加载结果相互独立,即使类名相同,只要由不同类加载器加载,JVM会视为不同类。这一特性在OSGi等模块化框架中被广泛应用。
通过重写ClassLoader的loadClass方法,可模拟双亲委派机制:
public class CustomClassLoader extends ClassLoader { @Override protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) { // 1. 检查类是否已加载 Class<?> c = findLoadedClass(name); if (c == null) { try { // 2. 委托父类加载器加载 if (getParent() != null) { c = getParent().loadClass(name); } } catch (ClassNotFoundException e) { // 父类加载失败,继续向下传递 } if (c == null) { // 3. 父类无法加载时,由当前类加载器尝试加载 c = findClass(name); } } if (resolve) { resolveClass(c); } return c; } } @Override protected Class<?> findClass(String name) throws ClassNotFoundException { // 模拟从特定路径加载类字节码 byte[] classBytes = loadClassBytes(name); if (classBytes == null) { throw new ClassNotFoundException(name); } return defineClass(name, classBytes, 0, classBytes.length); } private byte[] loadClassBytes(String name) { // 实际实现中需从文件系统、网络等读取类字节码 return null; }}验证逻辑:
尽管双亲委派机制是默认行为,但以下场景需主动破坏:
热部署与模块化
在OSGi框架中,每个模块拥有独立的类加载器,允许动态安装、卸载模块。为避免父加载器干扰,模块需自行决定是否委托加载。
例如,模块A依赖模块B的类,但模块B尚未加载,此时需绕过父加载器直接加载。
自定义类加载需求
加载非标准路径的类(如从数据库、网络读取字节码)。
实现类隔离(如Tomcat为每个Web应用分配独立类加载器,防止应用间类冲突)。
兼容性处理
某些历史系统(如JDK 1.2前的类加载器)未遵循双亲委派,需通过重写loadClass方法实现向下委托。
破坏方式:
双亲委派机制通过层次化委托模型,实现了类加载的唯一性、安全性和隔离性。其核心流程为:自底向上委托,自顶向下尝试加载。尽管该机制在大多数场景下可靠,但在模块化、热部署等需求下,需通过自定义类加载器灵活调整加载策略。理解双亲委派机制,对排查类冲突、设计高可用系统具有重要意义。