【吊打面试官系列】Java虚拟机JVM篇 - 关于双亲委派模型

大家好,我是锋哥。今天分享关于JVM双亲委派模型的JVM面试题,希望对大家有帮助;

什么是双亲委派模型?

双亲委派模型针对的是 Java 虚拟机中三个类加载器的,这三个类加载器分别是:

  1. 启动类加载器(Bootstrap ClassLoader)
  2. 扩展类加载器(Extension ClassLoader)
  3. 应用程序类加载器(Application ClassLoader)

如下图所示:

上面这几类类加载器构成了不同的层次结构,当我们需要加载一个类时,子类加载器并不会马上去加载,而是依次去请求父类加载器加载,一直往上请求到最高类加载器:启动类加载器。当启动类加载器加载不了的时候,依次往下让子类加载器进行加载。这就是双亲委派模型。
1000道 互联网大厂Java工程师 精选面试题-Java资源分享网1000道 互联网大厂Java工程师 精选面试题icon-default.png?t=N7T8http://java.python222.com/article/971

双亲委派模型的缺陷?

在双亲委派模型中,子类加载器可以使用父类加载器已经加载的类,而父类加载器无法使用子类加载器已经加载的。这就导致了双亲委派模型并不能解决所有的类加载器问题。
Java 提供了很多外部接口,这些接口统称为 Service Provider Interface, SPI ,允许第三方实现这些接口,而这些接口却是 Java 核心类提供的,由 Bootstrap Class Loader 加载,而一般的扩展接口是由Application Class Loader 加载的, Bootstrap Class Loader 是无法找到 SPI 的实现类的,因为它只加载 Java 的核心库。它也不能代理给 Application Class Loader ,因为它是最顶层的类加载器。

介绍下双亲委派机制的三次破坏?

虽然双亲委派机制是 Java 强烈推荐给开发者们的类加载器的实现方式,但是并没有强制规定你必须就要这么实现,所以,它一样也存在被破坏的情况,实际上,历史上一共出现三次双亲委派机制被破坏的情况:
  • 双亲委派机制第一次被破坏发生在双亲委派机制出现之前,由于双亲委派机制 JDK 1.2 之后才引用的,但类加载的概念在 Java 刚出现的时候就有了,所以引用双亲委派机制之前,设计者们必须兼顾开发者们自定义的一些类加载器的代码,所以在 JDK 1.2 之后的 java.lang.ClassLoader 中添加了一个新的 findClass 方法,引导用户编写类加载器逻辑的时候重写这个 findClass 方法,而不是基loadClass编写。
  • 双亲委派机制第二次被破坏是由于它自己模型导致的,由于它只能向上(基础)加载,越基础的类越由上层加载器加载,所以如果基础类型又想要调用用户的代码,该怎么办?这也就是我们上面那个问题所说的 SPI 机制。那么 JDK 团队是如何做的呢?它们引用了一个 线程上下文类加载器 (Thread Context ClassLoader),这个类加载器可以通过 java.lang.Thread 类的 setContextClassLoader 进行设置,如果创建时线程还未设置,它将会从父线程中继承,如果全局没 有设置类加载器的话,这个 ClassLoader 就是默认的类加载器。这种行为虽然是一种犯规行为,但 Java 代码中的 JNDIJDBC 等都是使用这种方式来完成的。直到 JDK 6 ,引用了 java.util.ServiceLoader,使用 META-INF/services + 责任链的设计模式,才解决了 SPI 的这种加载机制。
  • 双亲委派机制第三次被破坏是由于用户对程序的动态需求使热加载、热部署的引入所致。由于时代的变化,我们希望 Java 能像鼠标键盘一样实现热部署,即时加载(load class),引入了 OSGIOSGI 实现热部署的关键在于它自定义类加载器机制的实现,OSGI 中的每一个 Bundle 也就是模块都有一个自己的类加载器。当需要更换 Bundle 时,就直接把 Bundle 连同类加载器一起替换掉就能够实现热加载。在 OSGI 环境下,类加载器不再遵从双亲委派机制,而是使用了一种更复杂的加载机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

node.js快速入门-day03

个人名片: 😊作者简介:一名大二在校生 🤡 个人主页:坠入暮云间x 🐼座右铭:给自己一个梦想,给世界一个惊喜。 🎅**学习目标: 坚持每一次的学习打卡 文章目录 web服务器创建…

力扣hot100:34. 在排序数组中查找元素的第一个和最后一个位置(二分查找的理解)

我们知道使用二分查找能找到值所在的位置。假如我们在找到值后仍然不断的更新指针会发生什么?我们可以利用这一点来找到最左边的以及最右边的值。 如果当nums[mid]target时,使得 rightmid-1,那么最终会使得target在right的右边。 如果当nums[…

海外媒体宣发套餐推广攻略实现品牌全球化-华媒舍

如今,在全球经济一体化的浪潮下,品牌全球化已成为企业成功的重要因素之一。海外市场作为一个巨大而具有潜力的机会,吸引着越来越多的企业前往探索。而在海外市场的推广过程中,海外媒体宣发套餐成为了重要的推广方式之一。本文将为…

【S5PV210_视频编解码项目】裸机开发:实现按键的外部中断处理

加粗样式本文所作内容: 基于S5PV210芯片实现按键的外部中断处理程序,搭建中断处理流程框架 S5PV210对于中断处理的操作流程 1 外部中断得到触发: 1)外部中断在初始化阶段得到使能 2)外界达到了外部中断的触发条件 …

24考研数学最大教训❗️660/880过时了?

我没看错吧,说660题和880题过时了? 660题和880题好好用,这俩很经典不会过时。 660题是客观题训练必刷的一本题集,而880是强化阶段非常好的一本综合性题集。我本身在考研的时候使用的也是这两本题集,所以对这两本题集…

如何学习一个大型分布式Java项目

前言 很多同学在没有实习经验的时候看到一个多模块分布式项目总是有一种老虎吃天的无力感,就像我刚毕业去到公司接触项目的时候一样,模块多的夸张,想学都不知道从哪开始学,那么我们拿到一份代码后如何从头开始学习一个新项目呢。…

Oracle Primavera Analytics 是什么,与P6的关系?

前言 Oracle Primavera P6 Analytics 是与P6有关的一个相对较新的模块,Primavera 用户社区在很大程度上尚未对其进行探索。 那么它到底有什么作用呢? 通过了解得知它旨在通过深入了解组织的项目组合绩效,帮助高级管理层对其项目组合做出更好…

MySQL | 库的操作 | 表的操作

目录 1. 库的操作 1.1. 创建数据库 1.2. 字符集和校验规则 1.2.1. 查看系统默认字符集以及校验规则 1.2.2. 查看数据库支持的字符集 1.2.3. 查看数据库支持的字符校验规则 2. 操作数据库 2.1. 查看数据库 2.2. 显示创建语句 2.3. 修改数据库 2.4. 数据库的删除 2.4.…

维基百科推广秘诀13个方法助你成为行业领导者-华媒舍

维基百科(Wikipedia)作为全球最大、最权威的在线百科全书,拥有海量的知识内容,被广大用户广泛使用。对于任何一个领域的从业者来说,建立自己的维基百科页面,无疑是提升行业影响力的重要手段。本文将向您介绍…

Linux学习(4)——使用编辑器

1.gedit编辑器 简单易懂,依赖图形界面。可以使用ctrlc ctrlv等快捷键,ctrls进行保存,与windows系统中相类似。 2.vi/vim编辑器 vi/vim可以直接通过控制台的终端完成文本的编辑,不依赖图形界面,使用范围更广。它的编辑…

Redis数据结构对象之字符串对象

字符串对象 字符串对象的编码可以是int、raw或者embstr 如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么字符串对象会将整数值保存在字符串对象结构的ptr属性里面(将void *转换成long),并且将字符串对象的编码设…

【Cute】MMA抽象代码理解 c2d9bff3d88846eb8c523fb722166bc9

【Cute】MMA抽象代码理解 导读: cute 之 Layoutcute Layout 的代数和几何解释cute 之 Tensorcute 之 MMA抽象cute 之 简单GEMM实现 阅读本文前建议先读上面reed大神的数篇文章,文本逻辑主要是针对具体的代码,记录一下自己学习过程中的理解…

Atlas200板卡部署车道线

本博客包含推理的准备和部署代码,一步步实现部署。 这个运行时生成的一个batch的数据,NCHW,就是输入的N,单图片推理就是1,把里面的数量改成1,但是你可以多生成一些bin图片放到校准文件夹中,更改输出文件名…

“城市绿肺诊断:集成GIS、RS、VORS模型、CCDM模型、geodetecto、GWR模型技术深入解析生态系统与城镇化协调发展“

基于GIS、RS、VORS模型、CCDM模型、geodetecto、GWR模型集成的生态系统健康的耦合协调分析 城市群是一国经济发展水平的象征,也是一国经济发展到一定阶段的标志,我国城市群建设体量不断增加,将成为全球经济的核心,中国城市群的建…

MyFileServer

靶场下载地址 https://download.vulnhub.com/myfileserver/My_file_server_1.ova 信息收集 # nmap -sn 192.168.56.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-02-24 22:07 CST Nmap scan report for 192.168.56.2 (192.168.56.2) Host is up (0.…

HarmonyOS NEXT应用开发—状态栏显隐变化

介绍 本示例介绍使用Scroll组件的滚动事件 onScroll 实现状态栏显隐变化。该场景多用于各种软件的首页、我的等页面中。 效果预览图 使用说明 加载完成后显示状态栏显隐变化页面,上下拖动屏幕,顶端状态栏出现显隐变化。 实现思路 在置顶位置使用sta…

文件夹秒变应用程序?别慌,数据恢复有妙招!

在日常使用电脑的过程中,我们有时会遇到一个令人头疼的问题:原本好好的文件夹突然变成了应用程序的图标,点击也无法正常打开。这种“文件夹变应用程序”的现象不仅让人感到困惑,还可能导致重要文件的丢失或损坏。那么,…

vite ts vue 项目提示 . Projects must list all files or use an include pattern.

vite ts vue 项目提示 . Projects must list all files or use an include pattern. 在引用一个 ts 的时候,提示如下: 需要在 tsconfig.node.json 文件中添加: {"compilerOptions": {"composite": true,"skipLibC…

变量命名之函数命名

变量命名: 变量命名和函数名命名 方式一:camel命名 因相骆驼脊背形象命名 大骆驼法:当变量名或函数名由一个或多个单词连接在一起的,从第一个单词首字母也大写了,后面每个单词都大写. 例子: HI_S32 HI_MPI_VI_SetDevAttr(VI_DEV ViDev,const VI_DEV_ATTR_S* pstDevAttr);HI_S…

Vue2(四):Vue监测数据的原理

一、先来看一个问题 添加一个按钮点击更新马冬梅的信息&#xff1a; <button click"gengxin">点击更新马冬梅的信息</button> methods:{gengxin(){this.person[1].name马老师,this.person[1].age50,this.person[1].sex男}} 下面这种方式就不能奏效&a…