jvm双亲委派的含义

这个名字感觉和他要干的事情关系不大。

我们编译好的.class文件加载进方法区/元空间 需要用到类加载器,类加载器有很多种,有启动类加载器(Bootstrap ClassLoader),扩展类加载器(Extension ClassLoader),应用程序类加载器(AppClassLoader),每个类都只能用一个加载器加载进来,那某一个类到底是用哪个加载器呢?

各个类加载器加载的类对应如下:

  1. 启动类加载器负责加载 JDK 核心类库(如rt.jar),而Dog类是自定义类,不在其加载路径中,因此加载失败。
    扩展类加载器负责加载jre/lib/ext目录下的扩展类库,Dog类通常也不在此路径,因此加载失败。
    应用程序类加载器负责加载类路径(classpath)上的类,例如开发者编写的Dog类通常存放在项目的classpath下(如src目录编译后的classes文件夹),因此会被 AppClassLoader 成功加载。

当我们加载我们编写的Dog类的时候,jvm并不是直接用应用类加载器去加载,而是用启动类加载器去加载,显然,Dog类不是核心类库,加载不进去,退而采用扩展类加载器加载,当然,Dog也不是扩展类库,所以也加载不到,所以最终会由应用程序加载器加载。

如果我们写了个String 类,jvm采用哪个加载器,也是上面一样的选择过程,但是String类是核心类库里的类(jvm认的是类名,虽然你自己写了个String

类,但是JVM最开始用的是启动类去扫描String,所以会在核心类库扫到了String类,加载的是核心类库的类),所以最终jvm永远也找不到你自己写得这个类,会出现无法加载主类的报错。

如果你想自己写一个String类去替换核心类库的String类,则需要将你写好的String类放到核心类库目录(不建议这么做),则可能被启动类加载器加载。但这是人为修改路径的特殊情况,默认情况下自定义类都由 AppClassLoader 加载。

所以,我们写类名的时候,必须要避开java原有的类名。

这就是所谓的双亲委派机制

Java 的双亲委派机制(Parent Delegation Model)是类加载器(ClassLoader)的核心工作机制,其核心思想是 "先委托父加载器加载,父加载器无法加载时才由子加载器自行加载" 。这一机制确保了类加载的安全性和唯一性。

工作流程

当一个类加载器收到类加载请求时,它不会立即自己去加载,而是先将请求委托给其父类加载器

父类加载器重复这一过程,直到请求传递到顶层的启动类加载器

如果父类加载器能成功加载该类,则返回加载结果

如果父类加载器无法加载(通常是找不到该类),则将请求逐级回传,最终由最初的类加载器尝试加载

双亲委派机制通过层次化的委托模型,既保证了 Java 核心类库的安全,又实现了类加载的灵活性,是 Java 类加载系统的基础设计。

相关推荐
DKPT2 小时前
JVM栈溢出和堆溢出哪个先满?
java·开发语言·jvm·笔记·学习
胡小禾3 小时前
JDK17和JDK8的 G1
jvm·算法
海梨花3 小时前
今日八股——JVM篇
jvm·后端·面试
毕设源码-朱学姐7 小时前
【开题答辩全过程】以 爱心捐赠网站为例,包含答辩的问题和答案
java·eclipse
尘觉9 小时前
中秋节与 Spring Boot 的思考:一场开箱即用的团圆盛宴
java·spring boot·后端
Le1Yu9 小时前
2025-10-7学习笔记
java·笔记·学习
popoxf10 小时前
spring容器启动流程(反射视角)
java·后端·spring
AAA修煤气灶刘哥11 小时前
监控摄像头?不,我们管这个叫优雅的埋点艺术!
java·后端·spring cloud
寻星探路11 小时前
Java EE初阶启程记09---多线程案例(2)
java·开发语言·java-ee