JVM:类加载器
文章目录
- 一、什么是类加载器
- 二、类加载器的应用场景
- 三、类加载器的分类
- 1、分类
- 2、启动类加载器
- 3、Java中的默认类加载器
- (1)扩展类加载器
- (2)应用程序类加载器
- (3)arthas中类加载器相关的功能
- 四、双亲委派机制
- 1、介绍
- 2、双亲委派的作用
- (1)保证类加载的安全性
- (2)避免重复加载
- 3、Java中如何使用代码方式去主动加载一个类
- 4、类加载器
- (1)介绍
- (2)arthas中类加载器相关的功能
- 五、打破双亲委派机制
- 1、打破双亲委派机制的三种方式
- (1)自定义类加载器
- (2)线程上下文类加载器
- (3)Osgi框架的类加载器
- 六、JDK9之后的类加载器
一、什么是类加载器
类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。类加载器只参与加载过程总的字节码获取并加载到内存这一部分。

二、类加载器的应用场景

三、类加载器的分类
1、分类
- 类加载器分为两类,一类是Java代码中实现的,一类是Java虚拟机底层源码实现的。

- 类加载器的设计JDK8和8之后的版本差别较大,JDK8及之前的版本默认的类加载器有如下几种:

- 类加载器的详细信息可以通过Arthas classloader命令查看:classloader - 查看classloader的继承树,urls,类加载信息,使用classloader去getResource。

2、启动类加载器
- 启动类加载器(Boostrap ClassLoader)是由HotSpot虚拟机提供的、使用C ++编写的类加载器。
- 默认加载Java安装目录/jre/lib下的类文件,比如rt.jar,tool.jar,resource.jar等。

通过启动类加载器去加载用户jar包: - 放入jre/lib下进行扩展:不推荐,尽可能不要去更改JDK安装目录中的内容,会出现即使放进去由于文件名不匹配的问题也不会正常被加载。
- 使用参数进行扩展:推荐,使用-Xbootclasspath/a:jar包目录/jar包名,进行扩展。
3、Java中的默认类加载器
- 扩展类加载器和应用程序类加载器都是JDK中提供的、使用Java编写的类加载器。
- 他们的源码都位于sun.misc.Launcher中,是一个静态内部类。继承自URLClassLoader。具备通过目录或者指定jar包将字节码文件加载到内存中。

(1)扩展类加载器
- 扩展类加载器(Extension Class Loader)是JDK中提供的、使用Java编写的类加载器。
- 默认加载Java安装目录/jre/lib/ext下的类文件。

通过扩展类加载器去加载用户jar包:
- 放入/jre/lib/ext下进行扩展:不推荐,尽可能不要去更改JDK安装目录中的内容。
- 使用参数进行扩展:推荐,使用**-Djava.ext.dirs=jar包目录**,进行扩展,这种方式会覆盖原始目录,可以用;(windows)、:(macos/linux)追加原始目录。
(2)应用程序类加载器
加载classpath下的类文件。
(3)arthas中类加载器相关的功能
类加载器的加载路径可以通过classloader -c hash值查看:

四、双亲委派机制
1、介绍
由于Java虚拟机中有多个类加载器,双亲委派机制的核心是解决一个类到底由谁加载的问题。双亲委派机制指的是:当一个类加载器收到加载类的任务时,会自底向上查找是否加载过,再由顶向下进行加载。向上查找如果已经加载过,就直接返回Class对象,加载过程结束。这样就能避免一个类重复加载。如果所有的父类加载器都无法加载该类,则由当前类加载器自己尝试加载。所以看上去是指顶向下尝试加载。

2、双亲委派的作用
(1)保证类加载的安全性
通过双亲委派机制避免恶意代码替换JDK中的核心类库,比如java.lang.String,确保核心类库的完整性和安全性。
(2)避免重复加载
双亲委派机制可以避免同一个类被多次加载。
3、Java中如何使用代码方式去主动加载一个类
- 使用Class.forName方法,使用当前类的类加载器去加载指定的类。
public static Class<?> forName(String className)throws ClassNotFoundException {Class<?> caller = Reflection.getCallerClass();return forName0(className, true, ClassLoader.getClassLoader(caller), caller);}private static native Class<?> forName0(String name, boolean initialize,ClassLoader loader,Class<?> caller)throws ClassNotFoundException;
- 获取到类加载器,通过类加载器的loadClass方法指定某个类加载器加载。
4、类加载器
(1)介绍
每个Java实现的类加载器中保存了一个成员变量叫“父”类加载器,可以理解为他的上级,不是继承关系。

- 应用程序类加载器的parent父类加载器时扩展类加载器,而扩展类加载器parent是空,但是在逻辑上,扩展类加载器依然会把启动类加载器当成父类加载器处理。
- 启动类加载器使用C++编写,没有父类加载器。

下面体现了启动类加载器、扩展类加载器和应用程序类加载器的层级关系。

(2)arthas中类加载器相关的功能
类加载器的父子关系可以通过classloader -t查看

五、打破双亲委派机制
1、打破双亲委派机制的三种方式
(1)自定义类加载器
- 自定义类加载器并且重写loadClass方法,就可以将双亲委派机制的代码去除。
- Tomcat通过这种方式实现应用之间的类隔离。
- Tomact使用了自定义类加载器来实现应用之间类的隔离。每个应用会有一个独立的类加载器加载对应的类。

- Tomact使用了自定义类加载器来实现应用之间类的隔离。每个应用会有一个独立的类加载器加载对应的类。
- 先来分析ClassLoader的原理,ClassLoader中包含了4个核心方法。
- 双亲委派机制的核心代码位于loadClass方法中。

- 阅读双亲委派机制的核心代码,分析如何通过自定义的类加载器打破双亲委派机制。
- 打破双亲委派机制就是将下边的一段代码重新实现。

自定义类加载器默认的父类加载器:
-
以JDK8为例,ClassLoader类中提供了构造方法设置parent的内容。

-
这个构造方法由另外一个构造方法调用,其中父类加载器由getSystemClassLoader方法设置,该方法返回的是AppClassLoader。

两个自定义类加载器加载相同限定名类不会冲突:
- 在同一个Java虚拟机中,只有相同了加载器+相同的类限定名才会被认为是同一个类。
- 在Arthas中使用sc -d 类名的方式查看具体的情况。
(2)线程上下文类加载器
利用上下文类加载器加载类,比如JDBC和JNDI。
(3)Osgi框架的类加载器
历史上Osgi框架实现了一套新的类加载机制,允许同级之间委托进行类的加载。
六、JDK9之后的类加载器
- 由于JDK9引入了module的概念,类加载器在设计上发生了很多的变化。
- 启动类加载器使用Java编写,位于jdk.internal.loader.ClassLoaders类中。java中的BootClassLoader继承自BuiltinClassLoader实现从某块中找到要加载的字节码资源文件。启动类加载器依然无法通过java代码获取到,返回的仍然是null,保持了统一。

- 启动类加载器使用Java编写,位于jdk.internal.loader.ClassLoaders类中。java中的BootClassLoader继承自BuiltinClassLoader实现从某块中找到要加载的字节码资源文件。启动类加载器依然无法通过java代码获取到,返回的仍然是null,保持了统一。
- 扩展类加载器被替换成了平台类加载器(Platform Class Loader)。平台类加载器遵循模块化方式加载字节码文件,所以继承关系从URLClassLoader变成了BuiltinClasLoader,BuiltinClasLoader实现了从模块中加载字节码文件。平台类加载器的存在更多的是为了与老版本的设计方案兼容,自身没有特殊的逻辑。

相关文章:
JVM:类加载器
文章目录 一、什么是类加载器二、类加载器的应用场景三、类加载器的分类1、分类2、启动类加载器3、Java中的默认类加载器(1)扩展类加载器(2)应用程序类加载器(3)arthas中类加载器相关的功能 四、双亲委派机…...
支持向量机 (support vector machine,SVM)
支持向量机 (support vector machine,SVM) flyfish 支持向量机是一种用于分类和回归的机器学习模型。在分类任务中,SVM试图找到一个最佳的分隔超平面,使得不同类别的数据点在空间中被尽可能宽的间隔分开。 超平面方…...
宝塔面板以www用户运行composer
方式一 执行命令时指定www用户 sudo -u www composer update方式二 在网站配置中的composer选项卡中选择配置运行...
昇思25天打卡营-mindspore-ML- Day24-基于 MindSpore 实现 BERT 对话情绪识别
学习笔记:基于MindSpore实现BERT对话情绪识别 算法原理 BERT(Bidirectional Encoder Representations from Transformers)是由Google于2018年开发的一种预训练语言表示模型。BERT的核心原理是通过在大量文本上预训练深度双向表示࿰…...
【精品资料】模块化数据中心解决方案(33页PPT)
引言:模块化数据中心解决方案是一种创新的数据中心设计和部署策略,旨在提高数据中心的灵活性、可扩展性和效率。这种方案通过将数据中心的基础设施、计算、存储和网络资源封装到标准化的模块中,实现了快速部署、易于管理和高效运维的目标 方案…...
N6 word2vec文本分类
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊# 前言 前言 上周学习了训练word2vec模型,这周进行相关实战 1. 导入所需库和设备配置 import torch import torch.nn as nn import torchvision …...
excel、word、ppt 下载安装步骤整理
请按照我的步骤开始操作,注意以下截图红框标记处(往往都是需要点击的地方) 第一步:下载 首先进入office下载网址: otp.landian.vip 然后点击下载 拉到下方 下载站点(这里根据自己的需要选择下载&#x…...
【python学习】标准库之日期和时间库定义、功能、使用场景和示例
引言 datetime模块最初是由 Alex Martelli 在 Python 2.3 版本引入的,目的是为了解决之前版本中处理日期和时间时存在的限制和不便 在datetime模块出现之前,Python 主要使用time模块来处理时间相关的功能,但 time模块主要基于 Unix 纪元时间&…...
Android --- Kotlin学习之路:基础语法学习笔记
------>可读可写变量 var name: String "Hello World";------>只读变量 val name: String "Hello World"------>类型推断 val name: String "Hello World" 可以写成 val name "Hello World"------>基本数据类型 1…...
嵌入式智能手表项目实现分享
简介 这是一个基于STM32F411CUE6和FreeRTOS和LVGL的低成本的超多功能的STM32智能手表~ 推荐 如果觉得这个手表的硬件难做,又想学习相关的东西,可以试下这个新出的开发板,功能和例程demo更多!FriPi炸鸡派STM32F411开发板: 【STM32开发板】 FryPi炸鸡派 - 嘉立创EDA开源硬件平…...
`nmap`模块是一个用于与Nmap安全扫描器交互的库
在Python中,nmap模块是一个用于与Nmap安全扫描器交互的库。Nmap(Network Mapper)是一个开源工具,用于发现网络上的设备和服务。虽然Python的nmap模块可能不是官方的Nmap库(因为Nmap本身是用C/C编写的)&…...
JVM系列 | 对象的创建与存储
JVM系列 | 对象的生命周期1 对象的创建与存储 文章目录 前言对象的创建过程内存空间的分配方式方式1 | 指针碰撞方式2 | 空闲列表 线程安全问题 | 避免空间冲突的方式方式1 | 同步处理(加锁)方式2 | 本地线程分配缓存 对象的内存布局Part1 | 对象头Mark Word类型指针…...
【JavaScript 算法】快速排序:高效的排序算法
🔥 个人主页:空白诗 文章目录 一、算法原理二、算法实现三、应用场景四、优化与扩展五、总结 快速排序(Quick Sort)是一种高效的排序算法,通过分治法将数组分为较小的子数组,递归地排序子数组。快速排序通常…...
Excel如何才能忽略隐藏行进行复制粘贴?
你有没有遇到这样的情况:数据很多,将一些数据隐藏后,进行复制粘贴,结果发现粘贴后的内容仍然将整个数据都显示出来了!那么,Excel如何才能忽略隐藏行进行复制粘贴? 打开你的Excel表格 Excel如何…...
行人越界检测 越线 越界区域 多边形IOU越界判断
行人越界判断 越界判断方式:(1)bbox中心点越界(或自定义)(2)交并比IoU判断 越界类型:(1)越线 (2)越界区域 1.越线判断 bbox中心点xc、…...
「UCD」浅谈蓝湖Figma交互设计对齐
在现代数字产品的设计和开发过程中,选择合适的工具对于提高团队效率和保证产品质量至关重要。本文将从开发和设计两个不同的角度,探讨蓝湖和Figma两款流行工具的优势与不足,并提出结论和建议。 开发研发视角:蓝湖 优点: 清晰的设计规范:蓝湖为开发工程师提供了清晰的设计…...
VUE3 播放RTSP实时、回放(NVR录像机)视频流(使用WebRTC)
1、下载webrtc-streamer,下载的最新window版本 Releases mpromonet/webrtc-streamer GitHub 2、解压下载包 3、webrtc-streamer.exe启动服务 (注意:这里可以通过当前文件夹下用cmd命令webrtc-streamer.exe -o这样占用cpu会很少,…...
[PaddlePaddle飞桨] PaddleOCR-光学字符识别-小模型部署
PaddleOCR的GitHub项目地址 推荐环境: PaddlePaddle > 2.1.2 Python > 3.7 CUDA > 10.1 CUDNN > 7.6pip下载指令: python -m pip install paddlepaddle-gpu2.5.1 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install paddleocr2.7…...
Python应用开发——30天学习Streamlit Python包进行APP的构建(15):优化性能并为应用程序添加状态
Caching and state 优化性能并为应用程序添加状态! Caching 缓存 Streamlit 为数据和全局资源提供了强大的缓存原语。即使从网络加载数据、处理大型数据集或执行昂贵的计算,它们也能让您的应用程序保持高性能。 本页仅包含有关 st.cache_data API 的信息。如需深入了解缓…...
python实现openssl的EVP_BytesToKey及AES_256_CBC加解密算法
python实现openssl EVP_BytesToKey(EVP_aes_256_cbc(), EVP_md5(), NULL, pass, passlen, 1, key, iv); 并实现AES 256 CBC加解密. # encoding:utf-8import base64 from Crypto.Cipher import AES from Crypto import Random from hashlib import md5def EVP_BytesToKey(passw…...
量子程序编译器QLLVM入门:基于LLVM的经典-量子混合编译器
量子程序编译器QLLVM入门:基于LLVM的经典-量子混合编译器QLLVM 入门指南:基于 LLVM 的经典-量子混合编译器一、QLLVM 是什么它能做什么解决什么问题核心优势二、安装方式方式一:VSCode 插件(推荐)方式二:从…...
ref vs reactive:Vue 3 响应式 API 到底该怎么选
在 Vue 3 的响应式系统中,ref 和 reactive 是最核心的 API,但它们的定位、使用场景和底层实现存在本质差异。理解二者的区别并合理选择,是掌握 Vue 3 响应式编程的关键。以下从 7 个维度深入剖析,提供 2000 字级别的详细指南。 1.…...
效率神器:用快马AI将antigravity彩蛋变为你的趣味开发效率工具
今天想和大家分享一个提升开发效率的小技巧——把Python里经典的antigravity彩蛋变成日常开发的趣味工具。这个想法源于我发现很多开发者(包括我自己)在紧张的工作中容易陷入枯燥的重复劳动,而一些小小的趣味互动其实能有效缓解疲劳ÿ…...
CVPR/ICCV跟踪新趋势解读:对比学习如何让MOT模型学会“认人”?
对比学习如何重塑多目标跟踪:从特征判别到轨迹记忆的技术革命 在拥挤的街头,人类能轻易识别并持续关注某个特定行人——这种看似简单的生物视觉能力,却让计算机视觉系统奋斗了数十年。多目标跟踪(MOT)技术正经历着从&q…...
Cortex-A7 vs Cortex-A9 vs Cortex-A53:ARM架构演进与移动处理器选型指南
1. ARM架构演进简史:从A7到A53的技术跃迁 2005年首次亮相的Cortex-A8揭开了智能手机处理器的序幕,而真正让移动计算进入多核时代的则是2007年问世的Cortex-A9。这个采用乱序执行架构的处理器让安卓设备首次突破1GHz主频,德州仪器的OMAP4430和…...
C++20 中的协程与异步 I/O:探索高效编程新路径
C20 中的协程与异步 I/O:探索高效编程新路径 在 C 的发展历程中,每一次标准的更新都为开发者带来了新的特性和工具,以提升代码的性能、可读性和开发效率。C20 作为一次重要的更新,引入了协程这一强大的特性,它与异步 I…...
人形机器人核心部件揭秘:减速器、传感器如何撑起宇树和智元的未来?
人形机器人核心部件揭秘:减速器与传感器的技术革命 当波士顿动力的Atlas完成后空翻,当特斯拉Optimus在工厂灵活抓取零件,这些看似科幻的场景背后,是无数精密部件协同工作的结果。人形机器人的核心部件——减速器和传感器ÿ…...
IDEA中Module工程重命名的正确姿势与避坑指南
1. 为什么需要重命名Module工程? 在IntelliJ IDEA中开发多模块项目时,Module命名往往不是一蹴而就的。我遇到过很多次这样的情况:项目初期随便起了个module名字,随着业务发展发现名称与实际功能严重不符。比如有个数据分析项目&a…...
解锁3大模组维度:从入门到精通的进阶之路
解锁3大模组维度:从入门到精通的进阶之路 【免费下载链接】ModTheSpire External mod loader for Slay The Spire 项目地址: https://gitcode.com/gh_mirrors/mo/ModTheSpire ModTheSpire作为《杀戮尖塔》最强大的外部模组加载器,为玩家提供了无需…...
vibe coding实战:利用快马平台为诗歌朗诵会打造沉浸式互动网页
最近帮朋友策划了一场线上诗歌朗诵会,需要制作一个能实时互动的沉浸式网页。这个项目最有趣的地方在于,它不仅要展示诗歌内容,还要通过视觉和交互传递诗歌的情感氛围。这种强调"氛围编码"(vibe coding)的场景…...
