[java基础-JVM篇]3_JVM类加载机制

news/2025/2/25 11:59:12

摘要:JVM通过设立不同优先级和职责的加载器保证了类加载的安全性与灵活性,即双亲委派机制,但是实际生产中更复杂的需求又需要破坏双亲委派,即打破JVM约定过的类加载程序

目录

类的生命周期

类加载

加载

类加载器

双亲委派机制

总结

破坏双亲委派机制


类的生命周期

Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最 终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。

类加载

加载

类的加载方式多种多样,可以通过网络,也可以通用代理、数据库、压缩文件等多种方式。

但加载阶段,JVM都需要完成三件事情

1)通过一个类的全限定名来获取定义此类的二进制字节流。

2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入 口。

类加载器

从JVM角度看只有两种类加载器,一种是启动类加载起 Bootstrap ClassLoader ,另一种是其他所有的类加载器。

这里类加载器之间的父子关系一般不是以继承(Inheritance)的关系来实现的,而是通常使用 组合(Composition)关系来复用父加载器的代码。

双亲委派机制

双亲委派模型的工作过程是:如果一个类加载器收到了类加载的请求,它首先不会自己去尝加 载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的 加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请 求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。

总结

不同加载起负责的加载范围不一样。使用多个类加载器并采用双亲委派机制目的是确保类加载的层次关系和优先级,增强安全性与模块化。

单一类加载器无法实现这些功能。

安全性:比如类似java.lang.Obejct这样的核心类,限制必须使用启动类加载加载,确保不会被覆盖。这里使用特定加载器专门加载不可被覆盖的类(划分职责)。

而且因为委托机制,可以确保核心组件先加载。越基础、核心的类越先加载也可以保证基础类型一致性问题。

灵活性:不同加载器使用不同策略。

优先级和层次:划分了优先级,因为都会上抛,所以上面的加载器会先加载,且划分范围即有责任划分。这样做可以增强系统稳定性。

破坏双亲委派机制

Q:如果优先级最高最先被加载的类需要调用优先级最低最后被加载的类怎么办?

A:父类加载起发送请求让子类加载器加载

通过线程上下文类加载器,使用Thread的setContext-ClassLoader方法进行设置,即父类加载器请求子类加载器

Q:热部署热加载破坏双亲委派

A:以OSGi为例,通过更换类加载器做到。

OSGi 热部署通过每个模块(Bundle)拥有独立类加载器实现,允许动态更新模块而不重启系统。

更新时,OSGi 创建新类加载器加载更新后的类,并通过刷新包(Refresh Packages)更新依赖,确保新类可用。


http://www.niftyadmin.cn/n/5865469.html

相关文章

EX_25/2/22

找到第一天mystring练习&#xff0c;实现以下功能 mystring str "hello" mystring ptr "world" str str ptr; str ptr str[0] H #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #in…

JMeter性能问题

性能测试中TPS上不去的几种原因 性能测试中TPS上不去的几种原因_tps一直上不去-CSDN博客 网络带宽 连接池 垃圾回收机制 压测脚本 通信连接机制 数据库配置 硬件资源 压测机 业务逻辑 系统架构 CPU过高什么原因 性能问题分析-CPU偏高 - 西瓜汁拌面 - 博客园 US C…

选择排序:简单高效的选择

大家好&#xff0c;今天我们来聊聊选择排序&#xff08;Selection Sort&#xff09;算法。这是一个非常简单的排序算法&#xff0c;适合用来学习排序的基本思路和操作。选择排序在许多排序算法中以其直观和易于实现的特点著称&#xff0c;虽然它的效率不如其他高效算法&#xf…

在arm64设备(树莓派4B)上部署Hyperledger Fabric V2.5

arm64设备相较于x86设备功耗低、硬件成本低,树莓派4B是一个流行的arm64设备,本文记录在树莓派4B中部署Hyperledger Fabric V2.5的关键点,即与x86架构启动网络所需材料的差异。 成功部署示例 如图所示,Hyperledger Fabric V2.5.6 成功运行在了树莓派4B(8G内存版)中,即te…

奇异值分解(SVD)拟合平面

奇异值分解&#xff08;SVD&#xff09;拟合平面 在三维空间中&#xff0c;使用奇异值分解&#xff08;SVD&#xff09;来拟合平面是一种常见且有效的方法。下面将详细介绍其原理、实现步骤&#xff0c;并给出Python代码示例。 原理 给定一组三维空间中的点 P { p 1 , p 2…

【无标题】PHP-get_definde_vars

[题目信息]&#xff1a; 题目名称题目难度PHP-get_defined_vars2 [题目考点]&#xff1a; get_defined_vars — 返回由所有已定义变量所组成的数组此函数返回一个包含所有已定义变量列表的多维数组&#xff0c;这些变量包括环境变量、服务器变量和用户定义的变量。 [Flag格式…

DeepSeek-R1:通过强化学习激发大语言模型的推理能力

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列三DeepSeek大模型技术系列三》DeepSeek-…

如何解决 MySQL 数据库服务器 CPU 飙升的情况

大家好&#xff0c;我是 V 哥。当 MySQL 数据库服务器 CPU 飙升时&#xff0c;我们应该怎么办&#xff1f;从何入手解决问题&#xff0c;有没有什么套路&#xff0c;因为自古真情留不住&#xff0c;唯有套路得人心&#xff0c;虽然这是一句玩笑话&#xff0c;也算很贴切&#x…