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

专栏导航

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞复现】ActiveMQ文件上传漏洞(CVE-2016-3088)

Nx01 产品简介 Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件。ActiveMQ是消息队列服务&#xff0c;是面向消息中间件&#xff08;MOM&#xff09;的最终实现&#xff0c;它为企业消息传递提供高可用、出色性能、可扩展、稳定和安全保障。 Nx02 漏洞描述 Ap…

Mars3D与mars3d-cesium版本间兼容造成3dtiles和gltf数据处理相关记录

说明&#xff1a; 1.在引入Mars3D SDK后正常可以在F12打印的信息中可以看到Mars3D和Cesium版本信息。 2.在项目的package.json文件中同样可以看到安装后的版本号。 Mars3D对Cesium版本对应关系&#xff1a; 1.正常情况下mars3d依赖的cesium均是最新版本&#xff0c;并且对cesi…

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

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

npm i sass -D的含义

命令 npm i sass -D 是一个在Node.js项目中使用npm&#xff08;Node Package Manager&#xff09;安装Sass预处理器的命令。这个命令的各个部分含义如下&#xff1a; npm: 这是Node Package Manager的缩写&#xff0c;一个用于Node.js的包管理和分发工具&#xff0c;允许开发者…

78.乐理基础-非常见拍号如何打拍子

内容来源于&#xff1a;三分钟音乐社 上一个内容&#xff1a;76.乐理基础-打拍子-二连音、四连音-CSDN博客 非常见的拍子就是下图中除了红圈里的五个拍号的拍号 最大优先级的规则&#xff1a; 规则一&#xff1a;所有的拍号绝对&#xff0c;永远都可以以一拍为单位&#xff0…

[论文精读]Brain Network Transformer

论文网址&#xff1a;[2210.06681] Brain Network Transformer (arxiv.org) 论文代码&#xff1a;GitHub - Wayfear/BrainNetworkTransformer: The open-source implementation of the NeurIPS 2022 paper Brain Network Transformer. 英文是纯手打的&#xff01;论文原文的s…

001 Golang-channel-practice

最近在练习并发编程。加上最近也在用Golang写代码&#xff0c;所以记录一下练习的题目。 第一道题目是用10个协程打印100条信息&#xff0c;创建10个协程。每个协程都会有自己的编号。每个协程都会被打印10次。 package mainimport ("fmt""strconv" )func …

如何在iOS手机上查看应用日志

引言 在开发iOS应用过程中&#xff0c;查看应用日志是非常重要的一项工作。通过查看日志&#xff0c;我们可以了解应用程序运行时的状态和错误信息&#xff0c;帮助我们进行调试和排查问题。本文将介绍两种方法来查看iOS手机上的应用日志&#xff0c;并提供相应的操作步骤。 …

Hyperledger Fabric 消息协议

Fabric 中大量采用了 gRPC 消息在不同组件之间进行通信交互&#xff0c;主要包括如下几种情况&#xff1a;客户端访问 Peer 节点&#xff0c;客户端和 Peer 节点访问排序节点&#xff0c;链码容器与 Peer 节点交互&#xff0c;以及多个 Peer 节点之间的 Gossip 交互。 消息结构…

工业企业-专利引用、被引用数据(1985-2019年)

工业企业的专利引用和被引用数据提供了关于这些企业创新活动和技术影响力的信息。专利引用数据指的是工业企业在申请专利时引用的既有专利数量&#xff0c;这反映了企业在研发过程中对现有技术的依赖和融合。被引用数据则指其他后续专利对这些企业专利的引用次数&#xff0c;这…

控制el-table的列显示隐藏

控制el-table的列显示隐藏&#xff0c;一般的话可以通过循环来实现&#xff0c;但是假如业务及页面比较复杂的话&#xff0c;list数组循环并不好用。 在我们的页面中el-table-column是固定的&#xff0c;因为现在是对现有的进行维护和迭代更新。 对需要控制列显示隐藏的页面进…

SpringBoot 集成WebSocket详解

一、WebSocket概述 1、WebSocket简介 WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。 2、为什么需要WebSocket HTTP 是基于请求响应式的&#xff0c;即通信只能由客户端发起&#xff0c;服…

mybatis(动态sql及分页)

mybatis-动态sql及分页 1. 动态sql简述2. 动态sql示例2.1 if2.2 choose2.3 foreach2.4 sql 及 include2.5 sql中的特殊字符 3. 后台分页实现4. 数据版本号处理并发问题 1. 动态sql简述 mybatis的动态sql语句是基于OGNL表达式的。可以方便的在sql语句中实现某些逻辑. 总体说来m…

Vue 封装的 axios 类的使用(小bug 改进)

http类 import { baseUrl } from "./config"; //引入config.js中的配置 import axios from "axios"; //引入axios import qs from "querystringify"; //form-Data请求时的工具类class Http{axios null;lastRequestIntercept null…

Android BUG 之 Error: Activity class {} does not exist

项目场景&#xff1a; 更换包名&#xff0c;运行报错 问题描述 原因分析&#xff1a; 在替换包名的时候要确认&#xff0c;配置文件跟build中的保持一致&#xff0c;在更换后还要将旧包的缓存数据清理掉 解决方案&#xff1a; 1 替换后删除 app 下的build 文件夹 2 Rebuild Pr…

Leetcode2976. 转换字符串的最小成本 I

Every day a Leetcode 题目来源&#xff1a;2976. 转换字符串的最小成本 I 解法1&#xff1a;最短路 建图&#xff0c;从 original[i] 向 changed[i] 连边&#xff0c;边权为 cost[i]。没边的边权设为 INF。 然后用 Floyd 算法求图中任意两点最短路&#xff0c;得到 g 矩阵…

MT6785安卓核心板_联发科MTK6785/Helio G95/曦力G95核心板定制

MT6785安卓核心板是基于MT6785(Helio G95)处理器&#xff0c;具备八核处理器结构&#xff0c;包括2颗主频为2.05GHz的Cortex A76处理器和6颗主频为2.0GHz的Cortex A55处理器&#xff0c;以及六颗Cortex-A55处理器。而在GPU方面&#xff0c;采用了Arm Mali-G76 MC4&#xff0c;频…

zabbix监控windows主机

下载安装zabbix agent安装包 Zabbix官网下载地址: https://www.zabbix.com/cn/download_agents?version5.0LTS&release5.0.40&osWindows&os_versionAny&hardwareamd64&encryptionOpenSSL&packagingMSI&show_legacy0 这里使用zabbix agent2 安装 …

22、Kubernetes核心技术 - 整合Rancher通过界面管理k8s集群

目录 一、概述 二、Rancher API Server 的功能 2.1、授权和角色权限控制 2.2、使用 Kubernetes 的功能 2.3、配置云端基础信息 2.4、查看集群信息 三、Rancher 安装 3.1、前置环境 3.2、通过 Docker 来进行安装Rancher 3.3、在 Rancher 的界面上绑定k8s集群 3.4、在 …

C语言入门教程,C语言学习教程(第二部分:C语言初探)二

十、C语言的三套标准&#xff1a;C89、C99和C11 我们今天使用的 Windows、Linux、Mac OS 等操作系统都是由一种叫做 Unix 的系统演化而来。Unix 作为80年代主流的操作系统&#xff0c;是整个软件工业的基础&#xff0c;是现代操作系统的开山鼻祖&#xff0c;C语言就是为 Unix …