前情回顾

秋招面试中,我每次面试似乎都被问到关于JVM双亲委派的相关问题。

我先考考你你是怎么理解双亲委派机制的?这个名字你有没有觉得有问题?能举个简单例子说明一些双亲委派吗?双亲委派有何好处?如何打破双亲委派?

几乎所有相关问题都列举啦,以上问题我全部有幸被问过。

话不多说,正文开始~

典型案例

我们看如图案例,或许很多小伙伴在初学时可能都犯过。我看一些朋友留言说再学习SpringBoot时也犯过类似错误。

我自定义了一个类 Java.lang.String,然后在 main 方法里打印了一句话,运行直接报错。有小伙伴可能会想,明明类里面定义了main方法,为何报错 “找不到main方法” 。

可以短暂思考一下为何

其实,如果你明白 “双亲委派机制” 那这个问题你便可以很轻松搞懂啦。

首先,运行程序肯定先执行main方法,要执行main方法就得先加载其类,也就是 java.lang.String ,类加载请求来到类加载器,会一层一层往上委派,最终来到引导/启动类加载器(Bootstrap ClassLoader)。

然后该类加载器发现 java.lang.String 是核心API里面的类,是自己管理范畴(加载核心类库(JAVA_HOME/lib 如rt.jar)),于是加载的核心API里面的那个 java.lang.String ,但是这个 String 类里面是没有main方法的,于是报错了。

双亲委派机制

何为双亲委派机制?

通过上述例子,大家应该差不多对 双亲委派机制 有所体会啦,此处再作归纳总结:

我喜欢简单通俗易懂的表达。

含义:类加载请求来了,类加载器自己先不加载,先让父类加载器加载,父类不行自己再来 。

画个图结合理解一下。

顺带说一下这几个加载器的作用(同被考过许多次 阿里 京东):

  • 启动类加载器:加载核心类库(JAVA_HOME/lib 如rt.jar)

  • 扩展类加载器:加载扩展类(JAVA_HOME/jre/lib/ext)

  • 系统类加载器:加载用户类路径ClassPath下的类

  • 用户自定义加载器:继承java.lang.ClassLoader

如何打破双亲加载机制?

自定义类加载器,重写 loadClass 方法、线程上下文类加载器

具体哪里有所体现呢?

Java 涉及 SPI 机制的都用线程上下文类加载器。父类加载器请求子类加载器完成加载动作 SPI机制:为接口找寻服务(jdbc) SPI约定:服务提供者为接口提供接口实现后,会在 jar 包的 META-INF/service/目录下创建一个以服务接口命名的文件。

jdb4.0 使用 SPI 机制,DriverManage r需要去 jar 包下的 META-INF/services/java.sql.Driver 目录下去寻找对应的 Driver 加载,但是 DriverManager 在 rt.jar 中,使用启动类加载器(BootStrapClassLoader),他需要调用服务提供者放在classpath下的类,启动类加载器无法加载,就只得使用线程上下文加载器,让父类加载器调用子类加载器完成,打破了双亲委派机制。

双亲委派机制好处?

还是简单提取关键字,因为本专栏是针对面试的,尽量通俗简介易记

好处:避免类重复加载+防止核心类篡改+安全性

具体体现可以结合本文开头的例子,假想可以篡改核心类,我自己定义一个类植入错误程序就可以使得整个系统崩溃。

你是否觉得 双亲委派 这个名字有问题?

哈哈 其实读完上文这个问题已经很清楚啦,明明是父类委派加载,为啥要叫双亲委派??

官方文档对 双亲委派 解释:

The Java platform uses a delegation model for loading classes. The basic idea is that every class loader has a “parent” class loader. When loading a class, a class loader first “delegates” the search for the class to its parent class loader before attempting to find the class itself.

java平台通过委派模型去加载类。每个类加载器都有一个父加载器。当需要加载类时,会优先委派当前所在的类的加载器的父加载器去加载这个类。如果父加载器无法加载到这个类时,再尝试在当前所在的类的加载器中加载这个类。

所以,java 的 类加载机制 应该叫做 “父委派模型”,不应该叫做“双亲委派机制”。翻译问题吧,我觉得是,不必太过纠结,我想面试官这样问,只是看你是否真正理解双亲委派机制,你就把 双亲委派机制原理 讲给他听就是。

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

阿里预面:谈谈你对双亲委派机制的理解?这个名字有啥问题?如何打破?为啥双亲委派?...相关推荐

  1. 谈谈你对Java异常处理机制的理解

    谈谈你对Java异常处理机制的理解 先谈谈我的理解:异常处理机制可以说是让我们编写的程序运行起来更加的健壮,无论是在程序调试.运行期间发生的异常情况的捕获,都提供的有效的补救动作,任何业务逻辑都会存在 ...

  2. 【Code皮皮虾】带你盘点双亲委派机制【原理、优缺点】,以及如何打破它?

    文章目录

  3. 【Java 虚拟机原理】Android 类加载机制 ( 双亲委派机制 | BootClassLoader | PathClassLoader | DexClassLoader )

    文章目录 一.Android 类加载机制 二.双亲委派机制 一.Android 类加载机制 Android 中的类加载 使用了 双亲委派 机制 , 如下图所示 : 在 Android 中提供了 333 ...

  4. JVM-白话聊一聊JVM类加载和双亲委派机制源码解析

    文章目录 Java 执行代码的大致流程 类加载loadClass的步骤 类加载器和双亲委派机制 sun.misc.Launcher源码解析 Launcher实例化 Launcher 构造函数 双亲委派 ...

  5. 破坏双亲委派机制的那些事

    前言 今天重读<深入理解Java虚拟>这本书,读到破坏双亲委派机制这一小节,其中有一段话,如下 双亲委派模型的第二次"被破坏"是由这个模型自身的缺陷所导致的,双亲委派很 ...

  6. JVM学习笔记-03-类加载器及双亲委派机制

    JVM学习笔记-03-类加载器及双亲委派机制 文章目录 JVM学习笔记-03-类加载器及双亲委派机制 1. 类加载器 视频链接-最新JVM教程IDEA版[Java面试速补篇]-03-类加载器及双亲委派 ...

  7. JVM - 彻底理解打破双亲委派机制

    文章目录 Pre 双亲委派 何为打破双亲委派 如何打破双亲委派 演示 重写 ClassLoader#loadClass 失败原因探究 临时解决办法 验证是否成功 应用下新建Boss1类 自定义加载路径 ...

  8. 打破双亲委派机制有什么用_1.4 打破双亲委派机制

    什么是打破双亲委派机制呢? 那么这里第一步, 我们需要知道什么是双亲委派机制? 前面已经说了什么是双亲委派机制了, 那打破是怎么回事呢? 比如, 我现在有一个自定义类加载器, 加载的是~/com/lx ...

  9. (二)JVM成神路之剖析Java类加载子系统、双亲委派机制及线程上下文类加载器

    引言 上篇<初识Java虚拟机>文章中曾提及到:我们所编写的Java代码经过编译之后,会生成对应的class字节码文件,而在程序启动时会通过类加载子系统将这些字节码文件先装载进内存,然后再 ...

最新文章

  1. App Store上微信的评论地址
  2. Xamarin iOS开发实战1.1.3Xamarin版本
  3. Go安装web框架revel
  4. 《Android系统源代码情景分析》一书正在连载中
  5. Maven安装和配置环境变量
  6. c++ 11 移动语义
  7. Django Book 2.0 笔记——会话、用户和注册
  8. python——面向对象篇之异常和反射
  9. 美国纽约的一个摄像头!刷新即现奇迹!
  10. kotlin键值对数组_Kotlin程序以升序对数组进行排序
  11. 阿里云PolarDB重大更新:两大技术突破,传统数据库一键迁移上云
  12. RocketMQ(八)——Rebalance机制介绍
  13. LeetCode刷题(35)--Permutation Sequence
  14. 历时3个月,我们是如何为一个开源项目集资300万美元的?
  15. C语言课后习题(16)
  16. win7如何添加终端服务器,Win7怎么添加windows超级终端?
  17. donet编译原理(C#)
  18. 华为事件鸿蒙系统,科技大事件 迎接华为鸿蒙车机系统的到来
  19. 阿里云开发者大会观后感
  20. 【凸优化】maximal 与 maximum的不同

热门文章

  1. python 调用 tensorflow.dll_python tensorflow导入DLL加载失败
  2. 安装ubuntu出现花屏_电脑显卡花屏怎么办?电脑独立显卡花屏的原因和解决方法...
  3. html点击图片放大_vue 插件之picture-markert图片标注
  4. 学JAVA要学redis_新手学习Java对Redis简单操作
  5. 突破5G壁垒,睿至科技集团以技术实力赋能产业发展
  6. CarAppFocusManager
  7. python中的文件处理_python学习——python中的文件处理
  8. 判断数组中某个元素除自身外是否和其他数据不同_18 张图带你彻底认识这些数据结构...
  9. 【算法刷题1】二叉树的前序遍历
  10. 关于 VM Linux操作系统使用 360随身wifi的驱动安装问题