JVM-双亲委派模型-源码

细说Tomcat如何打破双亲委派(有源码和图) NULL 博文链接:https://flyfoxs.iteye.com/blog/2114149 立即下载
  • 1、什么是双亲委派模型

    已知每个类都有对应的类加载器,系统的ClassLoader在协同工作时会默认使用双亲委派模型:在类加载时先判断该类是否被加载过,已加载过的类会直接返回。没加载过的类加载的时候,先把该请求委派该父类加载器的loadClass()处理,由此可知所有的请求都会传送到顶层的启动类加载器。父类加载器无法处理的时候,才会自己进行处理。无父类加载器时启用BootstrapClassLoader作为父类加载器。这⾥的双亲更多地表达的是“⽗ ⺟这⼀辈”的⼈⽽已
    在这里插入图片描述

private final ClassLoader parent;
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{
 	synchronized (getClassLoadingLock(name)) {
 		// ⾸先,检查请求的类是否已经被加载过
 		Class<?> c = findLoadedClass(name);
 		if (c == null) {
 			long t0 = System.nanoTime();
 			try {
 				if (parent != null) {//⽗加载器不为空,调⽤⽗加载器loadClass()⽅法处理
 					c = parent.loadClass(name, false);
 				} else {//⽗加载器为空,使⽤启动类加载器 BootstrapClassLoader 加载
 					c = findBootstrapClassOrNull(name);
			 	}
 			} catch (ClassNotFoundException e) {
	 	//抛出异常说明⽗类加载器⽆法完成加载请求
 			}

 			if (c == null) {
 				long t1 = System.nanoTime();
 				//⾃⼰尝试加载
 				c = findClass(name);
 				// this is the defining class loader; record the stats
 				sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
 				sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
 				sun.misc.PerfCounter.getFindClasses().increment();
 			}
 		}
 		if (resolve) {
 			resolveClass(c);
 		}
        return c;
    }
}
  • 2、双亲委派模型的好处是?
    • 避免类的重复加载,保证Java的核心API不被篡改。((JVM 区分不同类的⽅式不仅仅根据 类名,相同的类⽂件被不同的类加载器加载产⽣的是两个不同的类)
  • 3、不想用双亲委派模型怎么办?
    • 为了避免双亲委托机制,我们可以⾃⼰定义⼀个类加载器,然后重载 loadClass() 即可。
  • 4、如何自定义类加载器?
    • 除了 BootstrapClassLoader 其他类加载器均由 Java 实现且全部继承⾃ java.lang.ClassLoader 。所有需要继承java.lang.ClassLoader。
不用标注数据!用SAM 3零成本搞定遥感图像分割:SegEarth-OV3保姆级上手教程 本文介绍了如何利用SAM 3和SegEarth-OV3实现零标注遥感图像分割,提供从环境配置到结果优化的完整教程。通过开放词汇语义分割技术,用户无需标注数据即可快速获得专业级分割结果,适用于光伏板统计、灾害评估等场景。 阅读详情

相关推荐

如何设计一个低代码平台

近些年来,低代码发展火热,各种低代码平台如雨后春笋纷纷崛起,这些平台各定位不同,优劣不同,用户的选择空间很大。那么,如果用户想从零开始设计一个低代码平台,该如何做呢?

Jarod_Chou的博客 8256

从源码探究双亲委派机制

首先我们要知道双亲委派机制是为了解决什么问题?有关类加载器,可以参考我的这篇博客:  所谓的双亲委派,就是先让父亲加载器试图加载该Class,只有在父亲加载器无法加载该类时才尝试从自己的类路径中加载该类。   通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父亲加载器,依次递归,如果父亲加载器可以完成类加载任务,就成功返回;   只有父亲加载器无法完成此加载任务时,才自己去加载。我们通过这张图来理解一下: 在被动的情况下,当一个类加载器收到加载请求,他不会首先自己去加载,而是传递

想着百万年薪努力的小赵 2万+

详解岭回归与L2正则化

最小二乘法存在不可逆和病态问题,导致解析解不可计算或不稳定,岭回归是一种有效的解决方法,以损失无偏性来换取稳定解, 本文介绍详细介绍了岭回归的基本原理,并从L2正则化角度来进行了解释。

Luoyingfeng的博客 1万+

从源码理解双亲委派机制,原来如此简单

Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式。简单来说,双亲委派机制,就是app加载器先向上交由父类加载器进行加载,父类中找不到,再由子类加载器自行加载。具体来说:如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;

纵横千里 捭阖四方 的专栏 814

Infineon MOSFET开关损耗计算实战指南

本文是英飞凌MOSFET开关损耗计算的实战指南。针对MOSFET发热问题,文章深入剖析了开关损耗的产生机理,并基于Infineon数据手册的关键参数,手把手推导了开通与关断损耗的工程计算公式。同时,指南强调了栅极电阻、寄生参数等实际因素对损耗的影响,并提供了从理论计算到实测优化的完整路径,帮助工程师精准评估与优化电源设计。

weixin_29212867的博客 441

Ferry工单平台部署

ferry工单平台部署

运维求生之路 1897

深入JVM:从源码剖析双亲委派机制

本文小豪将带大家探索双亲委派,从源码剖析类加载器的双亲委派机制,同时结合案例,分析如何打破双亲委派。双亲委派是Java类加载器中比较重要的一个知识点,本质上是为处理类加载过程中某个类具体应该交由谁来加载。在JVM中,加载某一个类,先委托上一级的父加载器进行加载,如果上级加载器也有上级,则会继续向上委托,如果该类委托的父加载器没有被加载,子加载器就会尝试自己加载该类。即向上委托,向下加载

Code豪客 1901

抖音无水印视频爬虫实战:从抓包分析到批量下载指定用户作品

抖音作为当前最受欢迎的短视频平台,拥有海量的优质内容。很多用户希望备份自己或他人的作品,但抖音官方并未提供批量下载功能,且直接下载的视频带有平台水印。本文将带领大家从零开始,通过抓包分析、设备模拟、请求签名等核心技术,实现一个完整的抖音无水印视频爬虫系统。本文仅供技术学习和个人备份使用,请勿将爬取的内容用于商业用途或侵犯他人版权,爬取频率请控制合理范围内。目录一、前言二、技术栈概览三、准备工作3.1 环境搭建3.2 抓包分析步骤3.3 关键API发现四、核心技术解密4.1 X-Gorgon签名算法。

2201_76125261的博客 846

双亲委派机制源码浅析

每⼀个类都有⼀个对应它的ClassLoader类加载器,类加载器在⼯作时会默认使⽤双亲委派机制; ClassLoader的具体作用就是将class字节码文件加载到jvm虚拟机中去,程序就可以正确运行了; 但是,jvm启动时并不会一次性加载所有的class文件,而是根据需要去动态加载;所谓双亲委派机制,就是调用ClassLoader的loadClass的规则: 为什么要从下到上检查? 为了避免重复加载;某些情况下需要打破双亲委派机制: JDBC的DriverManager默认是由启动类加载器加载,但启动类加载

机械工程跑路哥 359

微信小程序 - 最新实现项目适老化设计全流程及源码,老年模式大字版与常规版页面样式切换,老年人大字模式字体与布局更换关怀版解决方案(新老项目均适用的方案,全局页面统一修改文本字号/DOM排版元素等)

微信小程序,vue2,vue3,老年大字版设计,小程序开发如何实现适老化方案,放大字体字号及改变页面的布局,小程序关怀模式实现思路及代码,统一将布局都改了,全局修改字体大小适配老年人看不清问题,小程序怎么接入老年模式并根据模式改变页面的UI设计,实现全局修改字体大小适老化/关怀版改造,最新详细示例代码全流程,字体放大/缩小,老项目怎么适配老年人模式方案,小程序适老化设计指南,当切换成老年模式时页面所有排版都会发生变化,小程序vue开发,新手详细教程,老年模式字体设置思路和UI布局的设计,开发者可以通过wx.

🏆 前端领域优质创作者 7306

LVS 负载均衡面试题及参考答案

什么是 LVS 负载均衡?它的主要作用是什么? LVS(Linux Virtual Server)是一个基于 Linux 内核的开源负载均衡项目。它通过将请求流量按照一定的算法分发到后端的多个真实服务器(Real Server)上,从而实现负载均衡的功能。 从原理上来说,LVS 工作在网络层和传输层之间。当客户端发起请求时,请求首先到达 LVS 服务器,LVS 会根据预先设定的规则和算法,比如轮询(Round - Robin)、加权轮询(Weighted Round - Robin)、最少连

大模型大数据攻城狮的专栏 1468

从源码入手,手把手带你剖析Java类加载的双亲委派

自定义类加载器最常见的分为两种,遵循双亲委派机制与打破双亲委派机制,这里主要讨论后者。与之前提到线程上下文加载器类似(子线程默认继承父线程加载器),一个类的引用类同样都将由该应用类的类加载器加载,即若在ClassA中引用了ClassB,则ClassB也将会由ClassA的类加载进行加载,这也正是能够类隔离的实现原理之一。那么类隔离的作用是究竟是什么呢?正如上述所言,类的加载具有引用传递性,而一个模块中一个类只会加载一次,在类加载时通过判断是否加载,如是则跳过加载,也就是JVM虚拟机中每个类有且仅有一份。

BASK2312的博客 269

OMAPL138使用UPP读写测试

UPP测试代码 #include "hw_types.h" // 宏命令 #include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器 #include "soc_OMAPL138.h" // DSP C6748 外设寄存器 #include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明 #include "interrupt.h" // DSP C6748 中断相关应用程序接...

wangjie36的博客 1192

【JVM深度解析类加载机制与双亲委派模型的源码剖析】

JVM的类加载机制与双亲委派模型共同构筑了Java应用稳定运行的基石。通过层次化的加载器结构和“向上委派”的加载策略,它不仅确保了核心库的安全,也维护了类的一致性与隔离性。深入理解其源码实现,有助于开发者洞悉JVM的内部工作原理,在遇到类加载冲突、类找不到等复杂问题时能够快速定位根源。同时,了解如何以及为何要打破这一模型,也为实现更高阶的动态化、模块化技术方案提供了理论依据和实践指导。

u010390722的博客 406

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

JavaJDK源码面试题:JVM类加载过程与双亲委派模型深度解析

Java BitSet通过精妙的位运算和long数组设计,在空间和时间效率上达到了卓越的平衡。极致的内存效率:8倍于boolean数组的压缩存储高性能的批量操作:字级并行处理,充分利用CPU特性算法级优化:基于硬件指令的极致优化随着大数据和实时处理需求的增长,BitSet在以下场景具有重要价值:- 实时监控系统的事件标记- 大规模用户行为分析- 实时推荐系统的快速过滤- 数据库查询优化掌握BitSet的底层机制,不仅能够写出更高效的代码,更能深入理解位运算在系统优化中的强大威力。

2509_93908581的博客 329

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JVM类加载机制源码探秘:双亲委派模型实现原理、自定义类加载器开发及打破委派模型的场景分析

Java虚拟机(JVM)的类加载机制是Java体系结构的核心组成部分。它负责在运行时动态加载、连接和初始化类。与静态语言不同,Java的类加载是在程序运行期间进行的,这为Java带来了极高的灵活性。在实际开发中,我们经常需要实现自定义类加载器来满足特定需求。```java文件系统类加载器:从指定目录加载类文件if (classData == null) { throw new ClassNotFoundException("类未找到: " + name);```

A12345678588的博客 442

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

JVM---双亲委派模型(源码详解)

含义 1.双亲委派模型是从JDK1.2开始至今都在沿用的类加载模型,具体的逻辑是: 先看源码: protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(...

爱飞的笨鸟的博客 700

分析JVM双亲委派模型的类加载源码 自定义类加载器

双亲委派模型下,在父类加载器无法加载的情况下再由当前类加载器去加载。具体的实现逻辑在java.util.ClassLoader抽象类的loadClass方法中。 Boostrap ClassLoader | Extension ClassLoader | Application ClassLoader | | OtherClassLoader1 OtherClassLoa...

ChainingBlocks 760

0.1 、Spring 源码学习-JVM类加载器-双亲委派模型-Spring 中类加载机制

文章目录JVM 类加载机制双亲委派模型Spring 类加载机制 JVM 类加载机制 /** * 获取类加载器的测试方法 */ @Test public void test2() { //获取Test类的类加载器 sun.misc.Launcher$AppClassLoader@4dc63996 ClassLoader c = Test.class.getClassLoader(); ...

༺ bestcxx的专栏 ༻ 2581

JVM深度解析:双亲委派模型与类加载器面试问题实战

在JVM面试中,类加载机制始终是考察Java工程师核心能力的关键考点。而其中的双亲委派模型(Parent Delegation Model),更是面试官高频追问的“灵魂问题”——为什么说它能避免类的重复加载?如果模型被破坏,系统会面临怎样的风险?Spring、Tomcat这类框架是如何绕过双亲委派实现动态加载的?无论是理解类加载的底层原理,还是应对“类加载器设计思想”“ClassLoader源码逻辑”等进阶问题,掌握双亲委派模型都是解锁JVM面试的核心钥匙。

2401_87878486的博客 656

黑马程序员--05.类加载器--03【从JVM加载类的过程再看类加载器】【从Java源码再看双亲委派模型】

类加载器--3 从JVM加载类的过程再看类加载器 从Java源码再看双亲委派模型 ----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------ 1.    从JVM加载类的过程再看类加载器 (1). 类加载过程的加载阶段要点回顾 [1]. 在类加载过程的加载阶段中,JVM的规范之一是“通过全类名获取定义此类的二进制字节(by

歆明正航的专栏 1292

java ClassLoader源码剖析和双亲委派模型实现

ClassLoader是做什么的? 一个类的生命周期取决于它Class对象的生命周期,经历加载、连接、初始化、使用、和卸载五个阶段。ClassLoader负责将.class文件中的二进制数据加载到内存中,放到jvm的方法区中。 什么是双亲委派模型 一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器,如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载

rain_zhao_0102的博客 351

【类加载机制源码-双亲委派机制详解】

JVM的类加载机制基于双亲委派模型,确保类加载的安全性。类加载器包括启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用程序类加载器(AppClassLoader)。启动类加载器由C/C++实现,负责加载核心库;扩展类加载器加载扩展目录下的类库;应用程序类加载器加载classpath下的类库。双亲委派模型通过递归调用父类加载器的loadClass方法,确保类不会被重复加载,且核心类库不会被篡改。源码分析显示,类加载器通过parent属性

liwenhua的博客 963

JVM

JVM 主要流程图 Java源码编译由以下三个过程组成: 分析和输入到符号表 注解处理 语义分析和生成class文件 编译时期-语法糖 语法糖可以看做是编译器实现的一些“小把戏”,这些“小把戏”可能使得效率大大提升 其中最值得说的就是泛型了,这个语法糖可以说被我们经常使用的 泛型只会在Java源码中存在,编译过后会被替换为原来的原生类型(Row Type,也称为裸类型)。这个过程叫做...

weixin_40920882的博客 364

023-JVM-类加载器源码分析

上一篇:022-JVM-各类加载器加载哪些类?(类加载器的势力范围)https://yuhongliang.blog.youkuaiyun.com/article/details/111566140 类加载的过程分析: 1. loadClass() 加载任何类 package com.yuhl.c2020; /** * @author yuhl * @Date 2020/12/22 21:27 * @Classname LoadClassResource * @Description TODO */ pub

前路无畏的博客 1万+
上一篇: 基础-深拷贝VS浅拷贝
下一篇: MySQL-18全文本搜索-必知必会
酱油瓶啤酒杯
博客等级 码龄8年 35粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值