JVM类加载机制以及双亲委派模型的介绍

目录

1.类加载介绍

2.具体步骤

2.1加载

2.2验证

2.3准备

2.4解析

2.5初始化

3.加载过程中的策略-双亲委派模型


1.类加载介绍

类加载,指的是Java进程在运行的时候,把.class文件从硬盘读取到内存,并进行一系列校验解析的过程.

.class文件=>类对象.硬盘=>内村

类加载的过程在Java官方文档中有说明

类加载大致可以分为五个步骤:即 加载.验证 准备 解析 初始化这五个步骤.

下面我们分别来介绍这五个步骤干了一些什么

2.具体步骤

2.1加载

把硬盘上的.class文件找到并且打开文件,读取到文件内容.(具体就是二进制的数据)

2.2验证

此过程要确保读到的文件内容是合法的.class文件格式,即字节码文件格式

具体在Java虚拟机规范中有具体的说明.

类似于一个结构体的东西 

其中,u4表示四个字节的无符号证书,u2是连个字节的无符号整数.这里的描述方式类似于C语言中的结构体.contant_pool_count是主版本.下面的是次版本/ jvm执行.class文件的时候就会验证版本是否符合要求,一般高版本可以兼容低版本,反之则不行.magic也叫做magic number 是魔幻数字,广泛应用于二进制文件中,用来标识当前二进制文件的格式是哪种类型

2.3准备

这一步是给类对象申请内存空间.此时申请的内存空间是已经初始化的.里面的默认值为全0.在这个阶段中,类对象的静态成员变量的值也相对于是0了.

2.4解析

主要是对类的字符串常量进行处理 我们观察一下代码:

class Test{

 private String s = "hello";

}

上述代码中,s变量相对于保存了"hello"这个字符串常量的地址.但是文件中并没有地址这个概念,那么该如何保存呢?虽然没有地址,但是有一个类似于地址的偏移量的这一概念

/

此除文件填充给s "hello"的偏移量就可以叫做"符号引用"

接下来,我们把.class文件加载到内存中,就会把"hello"这个字符串加载到内存中.此时它就有地址了,接下来,就可以把s里的值替换成当前"hello"的真实地址了.

2.5初始化

针对对象完成后续的初始化,就是把各个部分的属性进行赋值填充.=>还要执行静态代码的逻辑,还可能会触发父类的加载.

而加载过程中也有很多的猫腻.这就涉及到加载环节的一个模型,即双亲委派模型

3.加载过程中的策略-双亲委派模型

该策略描述了如何查找.class文件的策略/

jvm中进行类加载的操作,有一个专门的模块,称为类加载器(ClassLoader)

JVM的类加载器默认有三个.(也可以自定义 ) 这三个分别是 
BootstrapClassLoader  -负责查找标准库的目录

ExtensionClassLoader - 负责查找扩展库的目录 (不同于Java语法规范中的标准库内容,这都是实现jvm的厂商额外扩充的功能,不同的厂商扩展的不一样,这块内容很少会用到了)

ApplicationLoader -负责查找当前项目和第三方库的目录

上述的三个类加载器存在父子关系,类似于二叉树,有一个指针 (引用)指向parent,指向自己的父类加载器.

双亲委派模型的工作过程

1.从ApplicationClassLoader为入口 开始工作

2 从ApplicationClassLoader不会立即工作而是把搜索任务较给自己的父亲ExtensionClassLoader

3ExtensionClassLoader也不会立即寻找,而是交给BootstrapClassLoader 

4BootstrapClassLoader 也不会立即找,也会找自己的父亲

5.BootstrapClassLoader 发现自己没有父亲,才会开始搜索目录,即标准库的内容 寻找符合要求的.class文件,如果找到了就开始打开文件.读文件.如果没找到就交给自己的孩子.尝试加载

6.ExtensionClassLoader收到父亲的任务后,自己搜寻.找到了进入后续流程.找不到就继续到孩子这一类加载器中尝试加载

7 ApplicationClassLoader开始搜索,如果找到了.就继续后面的,如果没找到就搜索自己的孩子,一般来说ApplicationClassLoader它已经没有孩子了,这时候还是找不到,就会抛出一个ClassNotFountExption异常.

按照上述的设定,如果代码中自己定义了一个和标准库一样名字的类,最终程序的执行效果,自己定义的不会被加载,而是会加载标准库中的类.

可以避免自己写的类名字和标准库重名了,导致标准库的类功能失效.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA切换JDK版本超详细步骤

😀 IDEA切换JDK版本详细教程,全网步骤最详细,实测可用。 文章目录 第一步、选择SDKs切换SDK版本:第二步、选择Modules切换Sources和Dependencies版本:第三步、选择Project切换SDK和Language Level版本:第四…

spellman电源维修高压发生器SL130N300/J1073

高压电源维修故障检修及处理: X射线衍射仪spellman电源维修,正常的开关电源电路,当合上电源开关并按下“通”按钮以后,自耦变压器即通电并发出轻微的嗡嗡声。这时电源指示灯会亮起,电源电源表有指数显示并可进行调试&…

O(N)线性dp,蓝桥2023省赛,有奖问答

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 无 2.2输出 3、原题链接 0有奖问答 - 蓝桥云课 (lanqiao.cn) 二、解题报告 1、思路分析 由于是…

Windows上websocket客户端连接定时存储消息到文件并加载文件定时发送服务端工具实现

场景 在业务开发中,需要对接三方websocket协议数据或者连接并存储线上websocket协议数据,需要使用websocket客户端 连接线上的websocket服务端获取并存储数据,然后将数据存储成文件格式可移植,并将数据复制 到本地,…

three.js如何实现简易3D机房?(一)基础准备-下

接上一篇&#xff1a; three.js如何实现简易3D机房&#xff1f;&#xff08;一&#xff09;基础准备-上&#xff1a;http://t.csdnimg.cn/MCrFZ 目录 四、按需引入 五、导入模型 四、按需引入 index.vue文件中 <template><div class"three-area">&l…

03_控制语句

1 C语言中控制语句概述 在c语言中&#xff0c;控制逻辑主要包含三种&#xff1a; 1.顺序执行&#xff1a; 所谓的顺序执行&#xff0c;指的程序按照特定先后顺序依次执行&#xff1b;也是C语言的特征(面向过程语言)&#xff1b; 2.选择分支&#xff1a; 在执行过程中&#x…

前后端分离项目Docker部署指南(下)

目录 前言&#xff1a; 一.安装nginx 创建目录 上传nginx.conf至/data/nginx/conf文件夹中 运行启动容器 上传静态资源文件 ​编辑 访问结果 前言&#xff1a; 在上一篇博客中&#xff0c;我们深入探讨了如何使用Docker部署一个前后端分离的项目中的后端部分。我们构建…

JavaScript基础知识(三)

JavaScript基础知识&#xff08;三&#xff09; 一、事件1. 事件绑定2.事件流2.1 事件捕获与事件冒泡 3.事件对象扩展3.1 阻止事件冒泡3.2 事件默认行为 4.事件委托5.事件类型5.1 鼠标事件5.2 键盘事件5.3 触屏事件 二、计时器方法1. setInterval 与 clearInterval2. setTimeou…

CMake 围炉札记

文章目录 一、CMake二、CMake 的一些用法1、指定 utf8 编码2、cmake rpath3、cmake 编译Release版本4、cmake重新编译5、cmake 不优化6、cmake 设置定义7、cmake 生成动态库8、cuda 一、CMake CMake 教程 Cmake官方教程解析 跨平台编译 VSCode 和 CLion Android CMake/JNI 二…

mac报错:zsh:command not found: brew

1、基本概述&#xff1f; 在使用brew安装程序的时候MAC提示&#xff1a; zsh:command not found: brew 本质就是brew没有安装&#xff0c;这个命令与linux系统中的yum命令类似。 使用的环境说明&#xff1a; 虚拟机版本&#xff1a;VMware Workstation 17 Pro mac os Ventu…

【风格迁移】StyTr2:引入 Transformer 解决 CNN 在长距离依赖性处理不足和细节丢失问题

StyTr2&#xff1a;引入 Transformer 解决 CNN 在长距离依赖性处理不足和细节丢失问题 提出背景StyTr2 组成StyTr2 架构 全流程优化原始子解法&#xff1a;VGG网络做内容特征提取替换子解法&#xff1a;使用GANs中的判别器进行特征提取 提出背景 论文&#xff1a;https://arxi…

如何选学生用的台灯?三分钟看懂护眼台灯怎么选!

其实仔细观察与经历过来的父母都知道&#xff0c;孩子从小用眼健康&#xff0c;最为重要的就是从他们开始坐到书桌前的那一时刻开始的&#xff0c;尤其是桌上的那一盏台灯。市面上很多劣质台灯&#xff0c;它们往往在许多看不见的细节上偷工减料&#xff0c;列如使用低质量处理…

持续更新 | 与您分享 Flutter 2024 年路线图

作者 / Michael Thomsen Flutter 是一个拥有繁荣社区的开源项目&#xff0c;我们致力于确保我们的计划公开透明&#xff0c;并将毫无隐瞒地分享从问题到设计规范的所有内容。我们了解到许多开发者对 Flutter 的功能路线图很感兴趣。我们往往会在一年中不断更改并调整这些计划&a…

MySQL--优化(索引)

MySQL–优化&#xff08;SQL语句执行慢&#xff0c;如何分析&#xff09; 定位慢查询SQL执行计划索引 存储引擎索引底层数据结构聚簇和非聚簇索引索引创建原则索引失效场景 SQL优化经验 索引 索引&#xff08;index&#xff09;是帮助 MySQL 高效获取数据的数据结构&#xff…

深入浅出Redis(四):Redis基于RDB、AOF的持久化

引言 Redis是一款基于内存的键值对数据结构存储系统&#xff0c;Redis基于内存且常用来缓存关系型数据库中的数据&#xff0c;但不代表着Redis不能进行持久化&#xff0c;本篇文章将深入浅出的说明Redis基于RDB和AOF的持久化方式 Redis支持两种持久化方式&#xff0c;RDB&…

Redis 缓存机制如何提高应用程序的性能?

在数字时代&#xff0c;一拍脑门儿我们就能感觉到信息的海量和处理速度的迫切。不管是刷个微博、下个单&#xff0c;还是玩个游戏&#xff0c;我们都希望能快上加快&#xff0c;一点不拖泥带水。这时候&#xff0c;缓存技术就扮演了个大英雄的角色&#xff0c;它能让数据存取的…

【排序】详解插入排序

一、思想 插入排序是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。具体步骤如下&#xff0c;将数组下标为0的元素视为已经排序的部分&#xff0c;从1开始遍历数组&#xff0c;在遍历的过程中当前元素从…

完美解决VMware中配置suse10虚拟机网络

一、注意&#xff01;&#xff01;&#xff01;配置suse10网络&#xff0c;需要在虚拟机关机状态下进行&#xff0c;否则会配置不成功&#xff1b; 二、配置与主机在同一网段(仅主机模式&#xff0c;网卡一)&#xff1b; 在suse系统关机状态下&#xff0c;Vmware中设置”虚拟网…

【每日一题】1976. 到达目的地的方案数-2024.3.5

题目: 1976. 到达目的地的方案数 你在一个城市里,城市由 n 个路口组成,路口编号为 0 到 n - 1 ,某些路口之间有 双向 道路。输入保证你可以从任意路口出发到达其他任意路口,且任意两个路口之间最多有一条路。 给你一个整数 n 和二维整数数组 roads ,其中 roads[i] = […

gofly接口入参验证使用介绍

接口传入的参数做相关性质验证是开发中较为常用&#xff0c;gofly框架内置校验工具&#xff0c;提供开发效率&#xff0c;开发接口简单调用即可实现验证&#xff0c;下面介绍gofly框架数据验证设计思路及使用方法。 gofly框架提供了功能强大、使用便捷、灵活易扩展的数据/表单…
最新文章