JVM类加载/双亲委派模型

news2024/11/17 7:22:17

类加载是一个复杂的过程, 那么我们平时说的类加载到底是干啥的呢?

一. 类加载是干啥的

我们都知道Java程序在运行之前, 需要进行编译, 由 .java => .class文件(二进制字节码文件) , 而在运行的时候呢, Java进程(JVM), 就会读取对应的 .class文件, 并且解析他的内容, 在内存中构造出类对象并进行初始化. 

总的来说就是: 类 从 文件 加载到 内存里.

二. 类加载过程

对于一个类来说, 他的生命周期是这样的: 

其中前五步是固定的顺序, 并且也是类加载的过程, 其中之间的三步属于连接, 所以对于类加载来说主要分以下几个步骤:

1. 加载.

2. 连接

  1. 验证
  2. 准备
  3. 解析

3. 初始化

下面来看集具体的执行内容.

1. 加载

找到 .class文件, 读取文件内容, 并且按照 .class文件的格式来解析.

在这个阶段, Java虚拟机需要完成一下三个事情:

  1. 通过一个类的全限定名来获取定义此类的二进制字节流.
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构.
  3. 在内存中生成一个代表这个类的java.lang.Class对象, 作为方法区这个类的各种数据的访问入口.

2. 验证

检查当前的 .class文件里的内容格式是否符合要求, 保证这些信息被当作代码后运行不会危害虚拟机自身的安全.

.class文件长啥样, 官方文档有明确描述. 如下图:

Chapter 4. The class File Format

3. 准备

给类里的静态变量分配内存空间.

假设这样一段代码:

static int a = 10;

准备阶段就是给 a 分配内训空间(四个字节), 同时他初始化的值是0, 而不是10.

4. 解析

初始化字符串常量, 把符号引用替换成直接引用. 也就是初始化常量的过程.

.class文件里就会包含字符串常量. (代码中也会有很多地方用到字符串常量)

比如代码里有一行:

String str = "hello world";

但是, 在类加载之前, "hello world" 这个字符串常量是没有分配内存空间 (得类加载完了之后, 才有内存空间), 没有内存空间, str 里也就无法保存字符串常量的真实地址, 只能先使用一个占位符, 标记一下, 这块是 "hello world" 这个常量的地址, 等到真正给他分配过内存之后, 然后就用这个真正的地址代替之前的占位符.

5. 初始化

针对类进行初始化, 初始化静态成员, 执行静态代码块, 并且加载父类.

三. 合适触发类加载呢?

使用一个类的时候就触发了.

  1. 创建了这个类的实例.
  2. 使用了类的静态方法/静态属性.
  3. 使用了类的子类, 加载子类会触发加载父类.

四. 双亲委派模型

类加载器

JVM加载类, 是由 类加载器(class loader) 这样的模块来负责的.

JVM自带了多个类加载器.

  1. Bootstrap Classloader  负责加载标准库中的类
  2. Extension Classloader  负责加载JVM扩展的库的类
  3. Application Classloader  负责加载自己项目里的自定义的类

这三个类加载器各自负责各自的那一部分.

什么是双亲委派模型?

描述上述类加载器相互配合的工作过程就是双亲委派模型.

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

如下图:

那么按照这个顺序加载的好处在哪呢?

好处在于: 如果一个程序猿正好写了一个类, 他的全限定类名和标准库中的类冲突了. (比如你自己写一个类叫做 java.lang.Thread) , 此时就可以保证类加载可以加载到标准库中的类, 防止代码加载出现问题.

  • 上述三个类加载器存在父子关系.
  • 进行类加载的时候, 输入的内容 全限定类名, 例如 java.lang.Thread.
  • 加载的时候, 从 Application Classloader 开始加载.
  • 如果到最后回到 Application Classloader 之后也没有找到类, 那么就会抛出一个 "类未找到" 的异常, 类加载就失败了.

然后我也很奇怪, 双亲委派模型, 怎么没有双亲啊, 这不是儿子,父亲,爷爷吗, 也没有父母怎么叫双亲啊, 这就是机翻害死人了.

 

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

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

相关文章

MySQL --- 函数大全 8

目录 1.返回一个字符串在出现指定数量的分隔符之前的子字符串 SUBSTRING_INDEX() 2.减去时间 SUBTIME() 3.返回总和 SUM() 4.返回函数执行的时间 SYSDATE() 5.返回参数的切线 TAN() 6.提取表达式传递的时间部分 TIME() 7.格式…

ZY_BMP280大气压模块的使用和stm32程序

在搞设计时,用到了大气压模块BMP280,这玩意也不难,主要是淘宝店老板特别der一问三不知,真服了,而且资料里面没有给例程,只有51的例程,利用IIC通信,而且给的例程里面,乱七…

说说 fiber、DOM、ReactElement、实例对象之间的引用关系

大家好,我是前端西瓜哥。 本文探究 fiber、DOM、ReactElement、类组件实例之间的引用关系说明。 React 版本为 18.2.0 原生组件 fiber 原生组件 fiber,指的就是 type 为 “span”、“div” 的 fiber。 fiber.stateNode 指向真实 DOM 节点;n…

Tableau可视化设计案例-03基本表、树形图、气泡图、词云

文章目录Tableau可视化设计案例03基本表、树形图、气泡图、词云1.基本表1.1基本表的使用1.2凸显表的使用1.3二值凸显表2.树形图2.1不同类型酒店数量与评价人数2.2油尖旺不同类型酒店数量与价格3.气泡图与词云3.1不同地区酒店数量与平均价格气泡图3.2动作电影动态气泡图3.3词云图…

Dubbo 4 Dubbo 高级特性 4.2 Dubbo 常用高级配置 4.2.1 序列化

Dubbo 【黑马程序员Dubbo快速入门,Java分布式框架dubbo教程】 4 Dubbo 高级特性 文章目录Dubbo4 Dubbo 高级特性4.2 Dubbo 常用高级配置4.2.1 序列化4.2 Dubbo 常用高级配置 4.2.1 序列化 【一个问题】 两个机器传输数据,如何传输Java对象&#xff…

【YOLOv7-环境搭建⑥】PyTorch安装

下载链接: 来源:(博主)唐三. 链接:https://pan.baidu.com/s/1y6s_EScOqvraFcx7iPSy1g 提取码:m1oa 安装步骤: 在命令指示符中输入以下命令: activate→conda activate py37→输入以下命令&#xff08…

【Python机器学习】密度聚类DBSCAN、OPTICS的讲解及实战演示(附源码 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 划分聚类、密度聚类和模型聚类是比较有代表性的三种聚类思路 1:划分聚类 划分(Partitioning)聚类是基于距离的,它的基本思想是使簇内的点距离尽量近、簇间的点距离尽量远。k…

UOS SDN

​ 文章目录 一.安装相关软件包二.上传并解压opendaylight软件包三.创建拓扑四.下发流表五.启动HTTP-server服务六.截图测试启动 OpenDayLight 的 karaf 程序,并安装如下组件: feature:install odl-restconf feature:install odl-l2switch-switch-ui feature:install odl-…

关于torch.fx的使用

torch.fx 前言 最近在学习一些AI编译器,推理框架的知识,恰好看到了torch.fx这个部分。这个其实在1.10就已经出来了,但是一直不知道,所以花了一点时间学习了这部分的内容。 以下所有的代码基于Mac M1 pytorch 1.13,其…

JavaScript(六):数组

JavaScript数组数组的创建方式数组的索引(不使用内置方法)数组的遍历数组中新增元素(不使用内置方法)数组的检测数组的方法数组的创建方式 1.利用new创建数组 var 数组名 new Array(); 例如: var arr new Array();…

一句话生成角色动画 # text2motion

‍‍‍‍当你和他人谈论人工智能的潜力时,很多人都表露出同样的担心:害怕被取代‍特别在最近几个月,随着生成式人工智能的投资和创新的爆炸性增长,这些不安的感觉更加强烈。机器学习中相对较新的创新,即扩散模型&#…

干货 | 轮廓逼近原理与OpenCV应用(附Python-OpenCV文档下载)

导 读 本文主要介绍轮廓逼近的原理及其在OpenCV中的使用演示。同时可在文末获取Python-OpenCV学习文档pdf。 背景介绍 轮廓逼近的应用比较广泛,如下路线俯视图的简化: 通过迭代平滑一些顶点,从而产出更加线性的路线: 当然这只是轮廓逼近的其中一个应用,后续我们将…

nodejs企业工厂设备维修管理系统vue

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 web简介 4 2.3 B/S结构 4 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:技术背景 5 …

【Linux权限】文件权限值,权限掩码,粘滞位,普通用户添加信任名单

目录 1.权限分为2种用户:超级用户,普通用户 2.文件类型和访问权限 ​3.权限掩码(八进制) 4.sudo短暂提升权限 5.粘滞位 1.权限分为2种用户:超级用户,普通用户 超级用户(通常为root&#x…

【前端开发学习】5.JQuery

文章目录1 JQuery2 快速上手3 寻找标签3.1 直接寻找3.2 间接寻找案例:菜单转换4 操作样式5 值的操作案例:动态创建数据库6 事件案例:表格操作7 前端整合案例1 JQuery 一个 JavaScript 的第三方模块(第三方类库)。 基…

再学C语言7:数据类型(3)——char类型

char类型用于存储字母和标点符号之类的字符 在技术实现上,char是整数类型,因为char类型实际存储的是整数而不是字符 为了处理字符,计算机使用一种数字编码,用特定的整数表示特定的字符 经典和常用的是ASCII码,标准A…

React学习29(react-redux最终完整版)

说明 1)所有变量名字要规范,尽量触发对象的简写形式 2)reducers文件夹中,编写index.js专门用于汇总并暴露所有的reducer 项目结构 代码示例 index.js import React from react import ReactDOM from react-dom import App fr…

ios 证书与签名

证书与签名 XCode中配置的Code Signing Identity(entitlements、certificate)必须与Provisioning Profile匹配,并且配置的Certificate必须在本机Keychain Access中存在对应Public/Private Key Pair,否则编译会报错。 X…

Improved Techniques for Training Score-Based Generative Models论文阅读

论文链接:Improved Techniques for Training Score-Based Generative Models 文章目录摘要引言背景郎之万动力学基于分数的生成模型选择噪声尺度初始的噪声尺度其它噪声等级结合噪音信息配置退火朗之万动力学EMA改善稳定性组合所有技巧定量结果消融研究更高分辨率结…

[附源码]计算机毕业设计PythonQ宝商城(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…