【JVM】双亲委派机制&打破双亲委派机制

双亲委派机制

类加载器的双亲委派机制

由于Java虚拟机中有多个类加载器,双亲委派机制的核心是解决一个类到底由谁加载的问题。

双亲委派的作用

  1. 保证类加载的安全性:通过双亲委派机制避免恶意代码替换 JDK中的核心类库。
  2. 避免重复加载:双亲委派机制可以避免同一个类被多次加载。

双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会自底向上查找是否加载过,再由顶向下进行加载

  • 每个类加载器都有一个父类加载器,在类加载的过程中,每个类加载器都会先检查是否已经加载了该类,如果已经加载则直接返回,否则会将加载请求委派给父类加载器。
  • 如果所有的父类加载器都无法加载该类,则由当前类加载器自己尝试加载。所以看上去是自顶向下尝试加载。

双亲委派机制——问题

  1. 重复的类:如果一个类重复出现在三个类加载器的加载位置,应该由谁来加载?
  • 启动类加载器加载,根据双亲委派机制,它的优先级是最高的
  1. String类能覆盖吗?在自己的项目中去创建一个java.lang.String类,会被加载吗?
  • 不能,会返回启动类加载器加载在rt.jar包中的String类

在java中如何使用代码的方式去主动加载一个类呢?

  • 方式1:使用Class.forName方法,使用当前类的类加载器去加载指定的类。
  • 方式2:获取到类加载器,通过类加载器的loadClass方法指定某个类加载器加载。

面试题——类的双亲委派机制是什么?

  1. 当一个类加载器去加载某个类的时候,会自底向上向父类查找是否加载过,如果加载过就直接返回,如果一直到最顶层的类加载器都没有加载,再由顶向下进行加载。
  2. 应用程序类加载器的父类加载器是扩展类加载器,扩展类加载器的父类加载器是启动类加载器。
  3. 双亲委派机制的好处有两点:第一是避免恶意代码替换JDK中的核心类库,比如java.lang.String,确保核心类库的完整性和安全性。第二是避免一个类重复地被加载。

打破双亲委派机制

打破双亲委派机制的三种方式

  1. 自定义类加载器

  • 自定义类加载器并且重写loadClass方法,就可以将双亲委派机制的代码去除
  • Tomcat通过这种方式实现应用之间类的隔离(每一个应用会有一个独立的类加载器加载对应的类),《面试篇》中分享它的做法

思考——两个自定义类加载器加载相同限定名的类,不会冲突吗?

不会冲突,在同一个Java虚拟机中,只有相同类加载器+相同的类限定名才会被认为是同一个类。

正确的去实现一个自定义类加载器的方式是重写findClass方法,这样不会破坏双亲委派机制。

  1. 现成上下文类加载器

  • 利用上下文类加载器加载类,比如JDBC和JNDI等

JDBC案例

JDBC中使用了DriverManager来管理项目中引入的不同数据库的驱动,比如mysql驱动、Oracle驱动

  1. 启动类加载器加载DriverManager。(JDK8中位于rt.jar,由启动类加载器加载)
  2. DriverManage使用SPI机制,最终加载jar包中对应的驱动类。

  3. SPI中使用了线程上下文中保存的类加载器进行类的加载,这个类加载器一般是应用程序类加载器。
  1. Osgi框架的类加载器
  • 历史上Osgi框架实现了一套新的类加载器机制,允许同级之间委托进行类的加载

OSGI模块化

  1. 历史上,OSGi模块化框架,它存在同级之间的类加载器的委托加载。OSGi还使用类加载器实现了热部署的功能。
  2. 热部署指的是在服务不停止的情况下,动态地更新字节码文件到内存中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的女IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值