【JVM】类加载过程|双亲委派模型

news2024/11/26 2:32:55

目录

四、类加载过程

1.类加载过程

2.双亲委派模型(经典面试题)

什么是双亲委派模型

双亲委派模型的优点

 破坏双亲委派模型


四、类加载过程

1.类加载过程

咱们写的java代码,是.java文件(硬盘),一个java进程要跑起来,就需要把.java先变成.class文件(硬盘),加载到内存中,得到“类对象”,其中就执行了指令,要执行的CPU指令,都是通过字节码(进入内存中)让JVM翻译出来的

从上⾯的图⽚我们可以看出整个JVM执⾏的流程中,和程序员关系最密切的就是类加载的过程了,所以接下来我们来看下类加载的执⾏流程。

对于⼀个类来说,它的⽣命周期是这样的:

类加载的几个环节(八股)

1.加载:在硬盘上,找到对应的.class文件,读取文件内容

2.验证:检查.class里的内容,是否符合要求

3.准备:给类对象,分配内存空间(元数据区)(类加载最终要得到的就是类对象),会把这个空间里的数据先全都填充为0(此时,如果这个类有静态成员,值就是0)

4.解析:针对字符串常量来初始化,把刚才.class文件中的常量的内容取出来,放到“元数据区”

5.初始化:针对类对象进行初始化(不是针对对象初始化,和构造方法无关),给静态成员进行初始化,执行静态代码块

此时类对象就搞定了

后续代码就可以使用这个类对象,创建实例,或者使用里面的静态成员了


2.双亲委派模型(经典面试题)

提到类加载机制,不得不提的⼀个概念就是“双亲委派模型”

站在Java虚拟机的⻆度来看,只存在两种不同的类加载器:⼀种是启动类加载器(Bootstrap  ClassLoader),这个类加载器使⽤C++语⾔实现,是虚拟机⾃⾝的⼀部分;另外⼀种就是其他所有的类加载器,这些类加载器都由Java语⾔实现,独⽴存在于虚拟机外部,并且全都继承⾃抽象类java.lang.ClassLoader。

站在Java开发⼈员的⻆度来看,类加载器就应当划分得更细致⼀些。⾃JDK 1.2以来,Java⼀直保持着三层类加载器、双亲委派的类加载架构器


什么是双亲委派模型

它出现在“加载”环节(第一步),根据代码中的写的“全限定类名”(包名+类名)找到对应的.class文件

这个模型描述了JVM加载.class文件过程中,找文件的过程

“类加载模型”在JVM中包含的一个特定的模块/类,这个类负责完成后续的类加载工作

JVM中内置了三个类加载器,负责加载不同的类

1)BootstrapClaaLoader (相当于爷爷)

负责加载标准库的类

2)ExtentionClassLoader(相当于父亲)

负责加载JVM扩展库的类

3)ApplicationClassLoader(相当于儿子)

负责加载第三方库的类自己写的代码的类

 此处的“父子关系”不是通过类的继承表示的(不是父类子类),而是通过类加载器中存在一个“parent”这样的字段,指向自己的父亲,类似于二叉树中的“三叉实现形式”)

“双亲委派模型”本身翻译是不准确的,更准确的翻译:“父亲委派模型”,“单亲委派模型”

工作过程举例:

给定一个类的全限定类名:java111.Test

此时加载过程如下:

(1)工作从ApplicationClassLoader开始进行

ApplicationClassLoader并不会立即搜索第三方库的相关目录,而是把任务交给自己的父亲来进行处理

(2)工作就到ExtentionClassLoader

ExtentionClassLoader也不会立即搜索负责的扩展库的目录,也是把任务交给自己的父亲来处理

(3)工作就来到BootstrapClaaLoader

BootstrapClaaLoader也像交给自己的父亲来处理,但是它的parent指向null,只能自己处理,BootstrapClaaLoader尝试在标准库的路径中搜索上述的类

(4)工作回到了ExtentionClassLoader

此时就要搜索扩展库对应的目录了

如果找到了,就由当前的类加载器负责打开文件,读取文件等后续操作...

如果找不到,任务就还是要继续还给儿子来处理

(5)工作回到了ApplicationClassLoader

此时要搜索第三方库/用户项目代码的目录了

如果找到了,也就是由当前的类加载器负责处理

如果没有找到,任务还是要继续还给儿子来处理

but,此时没有儿子了,还没找到,最早就会抛出一个ClassNotFoundException

本质就是:拿到任务,先交给父亲处理,父亲处理不了,在自己处理


双亲委派模型的优点

1. 避免重复加载类:⽐如A类和B类都有⼀个⽗类C类,那么当A启动时就会将C类加载起来,那么在B类进⾏加载时就不需要在重复加载C类了。

2. 安全性:使⽤双亲委派模型也可以保证了Java的核⼼API不被篡改,如果没有使⽤双亲委派模型,⽽是每个类加载器加载⾃⼰的话就会出现⼀些问题,⽐如我们编写⼀个称为java.lang.Object类的话,那么程序运⾏的时候,系统就会出现多个不同的Object类,⽽有些Object类⼜是⽤⼾⾃⼰提供的因此安全性就不能得到保证了(JVM会确保加载的类是标准库的类)


 破坏双亲委派模型

but 双亲委派模型虽然有其优点,但在某些情况下也存在⼀定的问题,⽐如Java中SPI(Service Provider Interface,服务提供接⼝)机制中的JDBC实现:

因为DriverManager位于rt.jar包,由BootStrap类加载器加载,⽽其Driver接⼝的实现类是位于服务商提供的Jar包中,是由⼦类加载器(线程上下⽂加载器 Thread.currentThread().getContextClassLoader)来加载的,这样就破坏了双亲委派模型了(双亲委派模型讲的是所有类都应该交给⽗类来加载,但JDBC显然并不能这样实现)

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

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

相关文章

手动用梯度下降法和随机梯度下降法实现一元线性回归

手动用梯度下降法实现一元线性回归 原文链接:https://www.cnblogs.com/qimoxuan/p/18407823 实验目的 本次实验旨在通过手动实现梯度下降法和随机梯度下降法来解决一元线性回归问题。具体目标包括: 生成训练数据集,并使用matplotlib进行可视化。设计一个`LinearModel`类来…

Mac清理其他文件:释放存储空间的高效指南

每个Mac用户都可能遇到存储空间不足的问题,尤其是当“其他”文件积累到一定体积时。在Mac上,“其他”文件通常包括各种系统文件、缓存、文档以及不被归类为应用程序、照片、电影或音乐的其他类型的文件。这些文件往往不易被注意,但逐渐占用了…

Java-idea小锤子图标

这一版的idea小锤子图标其实就在这里 点进去就找到了~

基于C#+SQL Server2008 开发三层架构(CS界面)图书管理系统

图书管理系统 一、项目背景及意义 当今由于信息技术的飞速发展,图书馆作为社会知识信息媒介的功能日益重要,网络环境下的信息资源建设知识仓库的设计,开放存取学术交流模式,知识管理系统,智能检索,数字参…

unocss 一直热更新打印[vite] hot updated: /__uno.css

控制台持续打印了几千条这条信息,页面逐渐卡死 client.ts:450 [vite] hot updated: /__uno.css 找出的原因是:依赖出问题了,重新安装unocss, 执行命令 npm i unocss 后修复。 但奇怪的是,删除node_modules重新全部安装…

一个简约的uniapp登录界面,基于uniapp+vue3+uview-plus

uniapp-vue3-template 一个简约的uniapp登录界面,基于uniappvue3uview-plus 页面主要包括:用户登录,手机验证码登录,用户注册,重置密码等页面 登录进去后为空白模板 源码在文末 界面 源码 uniapp登录界面源码

CyberDAO·S级市场旅游研讨会:川西之行圆满落幕

穿越人海 走进川西 在这个特别的秋天,CyberDAO组织了一场集结S级精英的“川西之旅”。此次研讨会不仅是DAO成员的一次盛大聚会,更是一场集会议、团队凝聚力提升和文化生活体验为一体的全方位旅程。2024年9月7日-10日,这支团队横跨山川湖海&a…

AttackGen - AI 网络安全事件响应测试工具,附下载链接

为了提高我们团队在安全活动中的响应效率,我关注到了一款叫 AttackGen 的工具,我们需要的是一个既能快速生成场景又能准确反映现实威胁的工具。 在红蓝对抗中,我们经常要模拟各种攻击场景,以测试我们的防御水平。这不仅仅是为了“…

【 C++ 】模板初阶

目录 ​编辑 一、泛型编程 二、函数模板 1.概念 2.格式 3.原理 4.匹配原则 三、类模板 1.定义格式 2.类模板的实例化 一、泛型编程 泛型编程是一种编程范式,它允许在编写代码时使用一种通用的数据类型或算法,以便在不同的数据类型上进行操作&…

如何将QAD系统EDI模块无缝迁移到知行之桥?

什么是QAD系统? QAD(Quality, Applications, Development)系统,是专为制造业设计的一款ERP软件,主要包含供应链管理、生产管理、财务和客户管理等业务功能,这家公司1979年成立于美国,目前在汽车…

STM32高级定时器实现:两路互补PWM输出,精准死区时间控制

目录 1. 实验目的: 2. 理论知识储备 2.1什么是互补输出? 2.2什么是死区控制,有什么用? 2.3参考手册的介绍 2.4了解死区寄存器(TIMx_BDTR) 3. 软件实现 3.1GPIO配置: 3.2TIM1初始化: 3.3主函数(main) 4. 实验…

NASA数据集:ASTER L2 地表辐射率 - VNIR 和串扰校正 SWIR V003

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ASTER L2 Surface Radiance - VNIR and Crosstalk Corrected SWIR V003 简介 ASTER 地表辐射度可见近红外和串扰校正 SWIR (AST_09XT) 是一个多文件产品 (https://lpdaac.usgs.gov/documents/996/A…

第二证券:这一板块大幅吸金!

9月10日,华为、苹果两大手机品牌的新机型一起发布,A股通讯设备板块获资金大幅流入。 在9月10日的新品发布会上,苹果推出了最新的iPhone 16系列,而华为则发布了新品Mate XT特殊大师。两大科技巨子几乎一起发布新品,灵敏…

基于Linux和C++实现的RabbitMQ风格消息队列:设计与实现

文章目录 0. 前言1. 需求分析① 核心部分② 核心API③ 交换机类型④ 持久化⑤ 网络通信⑥ 消息应答 2. 模块划分Ⅰ 服务端模块① 持久化数据管理中心模块② 虚拟机管理模块③ 交换机路由模块④ 消费者管理模块⑤ 信道管理模块⑥ 连接管理模块⑦ Broker Server模块 Ⅱ 客户端模块…

Android 生成so库 并调用

第一步:创建so库 第二步:看一下Native的项目结构 自动生成引用文件build.gradle(app) externalNativeBuild {cmake {path file(src/main/cpp/CMakeLists.txt)version 3.22.1}} //每个版本的开发工具不一样 我这个是自动生成的so库…

揭秘消防电动开窗机:一键开启生命通道

揭秘消防电动开窗机:一键开启生命通道 在城市的钢铁森林中,高楼大厦如雨后春笋般涌现,为现代生活带来了前所未有的便利与繁华。然而,当火灾等突发事件来临时,这些高耸的建筑也成了逃生与救援的巨大挑战。在这关键时刻&…

瑞芯微RK3568鸿蒙开发板OpenHarmony系统修改cfg文件权限方法

本文适用OpenHarmony开源鸿蒙系统,本次使用的是开源鸿蒙主板,搭载瑞芯微RK3568芯片。深圳触觉智能专注研发生产OpenHarmony开源鸿蒙硬件,包括核心板、开发板、嵌入式主板,工控整机等,提供瑞芯微RK3566、RK3568、RK3588…

重置turtle坐标及方向为初始值的Python函数:turtle.home()

【重置turtle坐标及方向为初始值的Python函数:turtle.home()】 import turtle as t t.setup(300,300,10,10) t.turtlesize(5,8) t.pensize(1) t.pencolor("red") t.left(60) t.forward(100) t.home()【代码分析】● 重置turtle坐标及方向为初始值的Pytho…

社区团购系统开发,小程序源码(团长中心、社区拼团、限时秒杀等)

前言 在数字化时代,社区团购作为一种新兴的购物方式,以其便捷、实惠的特点迅速赢得了消费者的青睐。 一、社区团购的基本概念 社区团购是一种基于社区的集体购买模式,通过线上平台组织社区居民集体采购商品,以团购的形式从供应商…

Go常用算法集锦

前言 在日常开发中,我们经常会遇到一些针对复杂数据的处理,这时我们就会针对不同的业务使用不同算法,减少代码的逻辑复杂度,增加项目的可维护性,而为了保障项目的可持续性,一般都会进行算法的封装&#xf…