JVM-类加载器-双亲委派

类加载器应用场景

企业级应用:SPI机制 类的热部署 Tomcat类的隔离
面试题:什么事双亲委派 打破类双亲委派 自定义类加载器
解决先上问题:使用Arthas不停机 解决线上故障




类加载器分类

1 启动类加载器 Bootstrap ClassLoader 加载核心类
2 扩展类加载器 Extension ClassLoader 加载扩展类 …/ext/…jar
3 应用程序类加载器 Application ClassLoader 加载应用classpath中的类
4 自定义类加载器 重写findClass方法

5 JDK9及以后得扩展类加载器变成了平台类加载器 Playform ClassLoader

类加载器分类 3个

类加载器分类 3个




双亲委派机制

核心:自底向上查找(是否被加载过) 自顶向下尝试加载

1、双亲委派机制用处:

1 保证类加载的安全性: 避免恶意代码替换jdk中核心类库,确保核心类库完整性和安全性
2 避免重复加载: 可以避免同一个类多次加载

2、加载流程

双亲委派执行流程




3、防止核心类被篡改案例

双亲委派执行流程




面试题

1、类的双亲委派机制是什么?

1、当一个类加载器去加载某个类的时候,会自底向上查找是否加载过,如果加载过就直接返回,如果一直到最顶层的类加载器都没有加载,再自顶向下加载(尝试进行加载)。

2、 应用程序类加载器的父类加载器是扩展类加载器,扩展类加载器的父类加载器是启动类加载器。

3、双亲委派机制的好处有两点:
第一是避免恶意代码替换JDK中的核心类库,比如java.lang.String,确保核心类库的完整性和安全性。
第二是避免一个类重复地被加载 (因为自底向上查找 若有则不会被重复加载 直接返回)


打破双亲委派机制※

打破双亲委派机制

1、自定义类加载器※

继承ClassLoader并重写loadClass方法 可以去除双亲委派机制
(如果只想自定义加载器 重写findClass方法就好 不会破坏双亲委派机制 loadClass方法里调用了findClass方法)

2、线程上下文类加载器

打破双亲委派机制JDBC1

打破双亲委派机制JDBC2


JDK8之后的类加载器

扩展类加载器被替换成平台类加载器 platform class loader
平台类加载器的存在是为了兼容老版本的设计方案 自身没有特殊逻辑