JVM工作原理与实战(十一):双亲委派机制

news2025/1/19 14:39:11

专栏导航

JVM工作原理与实战

RabbitMQ入门指南

从零开始了解大数据


目录

专栏导航

前言

一、双亲委派机制

1.双亲委派机制详解

2.父类加载器

3.双亲委派机制的主要作用

二、双亲委派机制常见问题

总结


前言

​JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了双亲委派机制、父类加载器、双亲委派机制的主要作用、双亲委派机制常见问题等内容。 ​


一、双亲委派机制

Java虚拟机中有多个类加载器,双亲委派机制(Parent Delegation Mechanism)是Java类加载器(ClassLoader)中的一个核心特性,它主要解决了类加载过程中类由谁来加载的问题。

1.双亲委派机制详解

双亲委派机制的核心思想是:当一个类加载器接收到加载类的请求时,它首先不会自己去尝试加载,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器(Bootstrap ClassLoader)中去,只有当父类加载器无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。

当一个类加载器接收到加载类的任务时,会自底向上查找是否加载过再由顶向下进行加载。

 

在类加载过程中,类加载器首先会检查是否已加载指定类。如果已加载,则直接返回对应的Class对象,否则会将加载请求委派给父类加载器。这种自底向上的查找过程称为“向上查找”,而自顶向下的加载过程则称为“向下委派”。

双亲委派机制作为一种严谨的类加载机制,确保了类的一致性和准确性,避免了类的重复加载。当所有父类加载器无法找到所需的类时,当前类加载器将承担起加载的责任,这看似是从顶向下的加载尝试。值得注意的是,向下委派加载不仅是一种责任转嫁,更体现了类加载的优先级。

2.父类加载器

在Java中,每个类加载器都有一个父类加载器(Parent ClassLoader),并不是继承关系,可以理解为它的上级。

在Java类加载器的体系中,应用程序类加载器(Application ClassLoader)的父类加载器是扩展类加载器(Extension ClassLoader)。而扩展类加载器的父类加载器并未明确定义,但在实际的代码逻辑中,扩展类加载器会将启动类加载器(Bootstrap Class Loader)视为其父类加载器进行处理。由于启动类加载器由C++编写,不存在父类加载器。

ClassLoader部分源码:

3.双亲委派机制的主要作用

双亲委派机制的主要作用有:

  • 保证类加载的安全性:由于双亲委派机制中,顶层的类加载器(如Bootstrap ClassLoader)负责加载核心类库,如java.lang包中的类。这种设计可以避免恶意代码替换核心类库,如java.lang.String,从而确保核心类库的完整性和安全性。
  • 避免重复加载:通过双亲委派机制,如果一个类已经被一个类加载器加载过,那么其他的类加载器就无需再次尝试加载,这样可以避免同一个类被多次加载的情况。

这种机制的优点在于它可以有效地避免类的重复加载,同时也可以保证核心类库的安全性。但是,它也有一些局限性,例如可能会影响到类的可见性和可移植性。

案例:

自定义String类(java.lang包下):

package lang;

public class String {
    static {
        System.out.println("自定义String类");
    }
}

获取类加载器:

public class Demo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        ClassLoader classLoader = Demo1.class.getClassLoader();
        Class<?> aClass = classLoader.loadClass("java.lang.String");
        System.out.println(aClass.getClassLoader());
    }
}

运行结果(无法获取启动类加载器):

这种设计避免了恶意代码替换核心类库。

二、双亲委派机制常见问题

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

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

2. 如果一个类重复出现在三个类加载器的加载位置,应该由谁来加载?

  • 启动类加载器负责加载核心类库,如java.lang包中的类,其优先级最高。在双亲委派机制下,每个类加载器在接收到加载请求时,首先会自底向上查找是否已加载过该类。若已加载,则直接返回Class对象,否则,将加载请求委派给父类加载器。

3. 在自己的项目中去创建一个java.lang.String类,会被加载吗?

  • 由于java.lang.String属于核心类库,由启动类加载器负责加载。因此,在自己的项目中尝试创建该类将会失败,因为启动类加载器已经加载了rt.jar包中的String类。

4. 这几个类加载器彼此之间存在关系吗?

  • 应用类加载器的父类加载器是扩展类加载器。而扩展类加载器没有明确的父类加载器,但在实际逻辑中,它会将启动类加载器视为其父类加载器。这种层次结构确保了核心类库的安全性和完整性。


总结

JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了双亲委派机制、父类加载器、双亲委派机制的主要作用、双亲委派机制常见问题等内容,希望对大家有所帮助。

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

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

相关文章

CDN的介绍以及加速内容传输原理

目前在公司的开发过程中&#xff0c;发现很多存储在oss的静态资源&#xff08;图片&#xff0c;安装包&#xff09;的链接中域名都使用了cdn域名&#xff0c;后面了解到这个cdn域名的主要作用是加速资源的访问&#xff0c;于是抽空了解了一下CDN加速原理。 目前使用得比较多的是…

【大厂算法面试冲刺班】day0:数据范围反推时间复杂度

常见算法的时间复杂度 规定n是数组的长度/树或图的节点数 二分查找&#xff1a;O(logn) 双指针/滑动窗口&#xff1a;O(n) DFS/BFS&#xff1a;O(n) 构建前缀和&#xff1a;O(n) 查找前缀和&#xff1a;O(1) 一维动态规划&#xff1a;O(n) 二维动态规划&#xff1a;O(n^2) 回溯…

Java后端返回的MySQL日期数据在前端格式错误的解决方法,区分jackson和fastjson

写在前面 在写web项目的时候经常会遇到后端返回的MySQL日期数据(date)类型在前端显示不正确的情况&#xff0c;有的时候会出现一串数字的时间戳&#xff0c;有的时候显示为日期晚了一天。 这是因Json给前端返回数据的时候格式问题造成的 解决方法 其实总结起来就是一句话在…

【Docker】私有仓库

目录 1.搭建 2. 上传镜像 3.拉取镜像 1.搭建 1.拉取私有仓库的镜像 docker pull registry 2.创建私有仓库容器 docker run -id --nameregistry -p 5000:5000 registry 3.打开浏览器,输入地址&#xff08;http:私有仓库服务器ip:5000/v2/_catalog&#xff09; 出现如图表示私…

Python - 深夜数据结构与算法之 Two-Ended BFS

目录 一.引言 二.双向 BFS 简介 1.双向遍历示例 2.搜索模版回顾 三.经典算法实战 1.Word-Ladder [127] 2.Min-Gen-Mutation [433] 四.总结 一.引言 DFS、BFS 是常见的初级搜索方式&#xff0c;为了提高搜索效率&#xff0c;衍生了剪枝、双向 BFS 以及 A* 即启发式搜索…

1.1数算选择题(循环队列、二叉树、查找、堆、顺序表、生成树、哈夫曼树、排序)

循环队列 front&#xff1a;头指针 rear&#xff1a;尾指针 m&#xff1a;循环队列的长度 元素个数&#xff08;rear-frontm&#xff09;%m 19-114048%408 11-194032%4032 二叉树 入度出度&#xff0c;n-1n0n1n2-1n12n2,有n21n0,对于完全二叉树&#xff0c;度为1的节点要…

挑战Transformer的新架构Mamba解析以及Pytorch复现

今天我们来详细研究这篇论文“Mamba:具有选择性状态空间的线性时间序列建模” Mamba一直在人工智能界掀起波澜&#xff0c;被吹捧为Transformer的潜在竞争对手。到底是什么让Mamba在拥挤的序列建中脱颖而出? 在介绍之前先简要回顾一下现有的模型 Transformer:以其注意力机制而…

重学JavaScript高级(八):ES6-ES12新增特性学习

ES6-ES12新增特性学习 ES6–对象字面量增强 属性的简写方法的简写计算属性名 let name "zhangcheng" //我想让sum作为obj的key值 let objKey "sum" let obj {//属性名的简写name//等同于name:name//方法的简写running(){}//等同于running:function()…

RT-DETR 更换骨干网络之 MobileNetV3 | 《搜寻 MobileNetV3》

论文地址:https://arxiv.org/abs/1905.02244 代码地址:https://github.com/xiaolai-sqlai/mobilenetv3 我们展示了基于互补搜索技术和新颖架构设计相结合的下一代 MobileNets。MobileNetV3通过结合硬件感知网络架构搜索(NAS)和 NetAdapt算法对移动设计如何协同工作,利用互…

使用 Open3D 的 3D LiDAR 可视化:用于自动驾驶的 2D KITTI 深度框架-含数据集+源码

3D LiDAR传感器(或)3维 光探测和测距是一种先进的发光仪器,能够像我们人类一样在3维空间中感知现实世界。这项技术尤其彻底改变了地球观测、环境监测、侦察以及现在的自动驾驶领域。它提供准确和详细数据的能力有助于增进我们对环境和自然资源的理解和管理。 在这篇权威研究…

仿stackoverflow名片与b站名片实现(HTML、CSS)

目录 前言一、仿stackoverflow名片HTMLCSS 二、仿b站名片HTMLCSS 素材 前言 学习自ACwing - Web应用课 一、仿stackoverflow名片 HTML <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport&…

【hyperledger-fabric】使用couchDB

简介 本文章主要参考来自于官方文档使用CouchDB以及 https://www.bilibili.com/video/BV1Li4y1f7ex/?spm_id_frompageDriver&vd_source2c5f2831e1c63d3a20045b167ae044e6 B站视频&#xff0c;还是非常感谢up主提供了学习的思路。 为什么要使用couchDB&#xff1f; 原文…

如何将Redis、Zookeeper、Nacos配置为Windows系统的一个服务

说明&#xff1a;当我们在Windows上开发时&#xff0c;不可避免的会用到一些中间件&#xff0c;如Redis、Zookeeper、Nacos等等&#xff0c;当在项目中使用到本地的这些服务器时&#xff0c;我们需要把本地的服务器启动&#xff0c;会开启下面这样的一个窗口。 Redis服务器&am…

vscode使用npm安装element-UI并添加router路由

npm安装vue&#xff0c;添加淘宝镜像-CSDN博客 elementUI安装与配置 安装可以看我上一篇文章 vscode控制台输入指令 npm i element-ui -S 安装完成后在目录结构打开下图文件 可以看到多了一行elementui就代表安装成功了 下面是项目常用的结构 安装完成后需要启用elementU…

稀疏矩阵的三元组表示----(算法详解)

目录 基本算法包括&#xff1a;&#xff08;解释都在代码里&#xff09; 1.创建 2.对三元组元素赋值 3.将三元组元素赋值给变量 4.输出三元组 5.转置&#xff08;附加的有兴趣可以看看&#xff09; 稀疏矩阵的概念&#xff1a;矩阵的非零元素相较零元素非常小时&#xff…

自承载 Self-Host ASP.NET Web API 1 (C#)

本教程介绍如何在控制台应用程序中托管 Web API。 ASP.NET Web API不需要 IIS。 可以在自己的主机进程中自托管 Web API。 创建控制台应用程序项目 启动 Visual Studio&#xff0c;然后从“开始”页中选择“新建项目”。 或者&#xff0c;从“ 文件 ”菜单中选择“ 新建 ”&a…

了解VR虚拟现实的沉浸式效果及其技术特点!

VR虚拟现实体验装置作为近年来人气火爆的科技产品&#xff0c;以其独特的沉浸式体验效果吸引了众多用户&#xff0c;那么&#xff0c;你知道这种VR体验装置是如何实现沉浸式体验效果的吗&#xff1f;它又具备了哪些技术特点呢&#xff1f; 一、真实的场景体验 VR虚拟现实技术通…

html的全选反选

一、实验题目 html实现选择框的全选和反选 二、实验代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>全选和反选</title></head><body><ul>兴趣爱好</ul><input id"all"…

深入理解 Hadoop (四)HDFS源码剖析

HDFS 集群启动脚本 start-dfs.sh 分析 启动 HDFS 集群总共会涉及到的角色会有 namenode, datanode, zkfc, journalnode, secondaryName 共五种角色。 JournalNode 核心工作和启动流程源码剖析 // 启动 JournalNode 的核心业务方法 public void start() throws IOException …

数据湖存储解决方案之Iceberg

1.Iceberg是什么&#xff1f; Apache Iceberg 是由 Netflix 开发开源的&#xff0c;其于2018年11月16日进入 Apache 孵化器&#xff0c;是 Netflix 公司数据仓库基础。Apache Iceberg设计初衷是为了解决Hive离线数仓计算慢的问题&#xff0c;经过多年迭代已经发展成为构建数据…