当前位置: 首页 > news >正文

JVM结构-类加载(类加载子系统,类加载的角色,类加载的过程,类加载器分类,双亲委派机制,类的主/被动使用)

JVM 结构-类加载

      • 2.1类加载子系统
      • 2.2类加载的角色
      • 2.3类加载的过程
        • 2.3.1加载
        • 2.3.2链接
        • 2.3.3初始化
      • 2.4类加载器分类
        • 2.4.1 引导类加载器
        • 2.4.2扩展类加载器
        • 2.4.3应用程序类加载器
      • 2.5双亲委派机制
      • 2.6类的主动/被动使用

2.1类加载子系统

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tfrRoBfQ-1678444842425)(C:\Users\封纪元\AppData\Roaming\Typora\typora-user-images\1641736009598.png)]

类加载器子系统负责从文件系统或者网络中加载 class 文件。 classLoader只负责 class 文件的加载,至于它是否可以运行,则由 Execution Engine 决定。 加载的类信息存放于一块称为方法区(元空间)的内存空间

2.2类加载的角色

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aABDOmzf-1678444842426)(C:\Users\封纪元\AppData\Roaming\Typora\typora-user-images\1641736435790.png)]

  1. class file 存在于硬盘上,可以理解为设计师画在纸上的模板,而最终这个模板 在执行的时候是要加载 JVM 当中来,根据这个模板实例化出 n 个一模一样的实 例

  2. class file 加载到 JVM 中,被称为 DNA 元数据模板,放在方法区中.

  3. 在.class–>JVM–>最终称为元数据模板,此过程就要有一个运输工具(类加 载器 Class Loader),扮演一个快递员的角色

2.3类加载的过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VBUCCfVo-1678444842426)(C:\Users\封纪元\AppData\Roaming\Typora\typora-user-images\1641736597177.png)]

2.3.1加载

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

2.3.2链接

验证:检验被加载的类是否有正确的内部结构,并和其他类协调一致;

验证文件格式是否一致: class 文件在文件开头有特定的文件标识(字节 码文件都以 CA FE BA BE 标识开头);主,次版本号是否在当前 java 虚拟机接收范围内.

​ **元数据验证:**对字节码描述的信息进行语义分析,以保证其描述的信息符合 java 语言规范的要求,例如这个类是否有父类;是否继承浏览不允许被继承的类 (final 修饰的类)…

准备:准备阶段则负责为类的静态属性分配内存,并设置默认初始值(如:int默认值0)不包含用 final 修饰的 static 常量,在编译时进行初始化.

例如: public static int value = 123;

value 在准备阶段后的初始值是 0,而不是 123.

解析:将类的二进制数据中的符号引用替换成直接引用(符号引用是 Class 文 件的逻辑符号,直接引用指向的方法区中某一个地址)

​ 例如: 编写代码 方法1 中调用 方法2 (符号引用)类加载到内存后把符号的引用地址换成内存的地址引用

2.3.3初始化

类什么时候初始化?

1 )创建类的实例,也就是 new 一个对象

2)访问某个类或接口的静态变量,或者对该静态变量赋值

3)调用类的静态方法

4)反射(Class.forName(“”))

5)初始化一个类的子类(会首先初始化子类的父类)

类的初始化顺序

先初始化静态的,多个静态的按照从上向下的顺序执行,

如果类有父类,则先初始化父类的静态,然后是子类.

如果是创建对象,先调用父类的构造方法,然后是子类自己的构造方法

顺序是:父类 static –> 子类 static –> 父类构造方法-

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UMOQztmF-1678444842426)(C:\Users\封纪元\AppData\Roaming\Typora\typora-user-images\1641737135662.png)]

2.4类加载器分类

站在 JVM 的角度看,类加载器可以分为两种:

  1. 引导类加载器(启动类加载器 Bootstrap ClassLoader). (不是java语言写的)
  2. 其他所有类加载器,这些类加载器由 java 语言实现,独立存在于虚拟机外部,并 且全部继承自抽象类java.lang.ClassLoader(java语言写的)

**站在 java 开发人员的角度来看,**类加载器就应当划分得更细致一些.自 JDK1.2 以 来 java一直保持者三层类加载器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mz8x6hVD-1678444842427)(C:\Users\封纪元\AppData\Roaming\Typora\typora-user-images\1641737528181.png)]

2.4.1 引导类加载器

  • 这个类加载器使用 C/C++语言实现,嵌套在 JVM 内部.它用来加载 java 核心类库
  • 并不继承于 java.lang.ClassLoader 没有父加载器
  • 负责加载扩展类加载器和应用类加载器,并为他们指定父类加载器
  • 出于安全考虑,引用类加载器只加载存放在<JAVA_HOME>\lib 目录,或者被-Xbootclasspath 参数锁指定的路径中存储放的类.

2.4.2扩展类加载器

  • Java 语言编写的,由 sun.misc.Launcher$ExtClassLoader 实现.
  • 派生于 ClassLoader 类.
  • 从 java.ext.dirs 系统属性所指定的目录中加载类库,或从 JDK 系统安装目录的 jre/lib/ext 子目录(扩展目录)下加载类库.如果用户创建的 jar 放在此目录下,也 会自动由扩展类加载器加载.

2.4.3应用程序类加载器

  • Java 语言编写的,由 sun.misc.Launcher$AppClassLoader 实现.
  • 派生于 ClassLoader 类.
  • 加载我们自己定义的类,用于加载用户类路径(classpath)上所有的类.
  • 该类加载器是程序中默认的类加载器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kGd0Pm0L-1678444842427)(C:\Users\封纪元\AppData\Roaming\Typora\typora-user-images\1641738018908.png)]

ClassLoader 类,它是一个抽象类,其后所有的类加载器都继承自 ClassLoader (不包括启动类加载器)

2.5双亲委派机制

Java 虚拟机对 class 文件采用的是按需加载的方式,也就是说当需要该类时才会 将它的 class 文件加载到内存中生成 class 对象.而且加载某个类的 class 文件 时,Java 虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tpTRt9nW-1678444842427)(C:\Users\封纪元\AppData\Roaming\Typora\typora-user-images\1641738216257.png)]

工作原理:

  1. 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请 求委托给父类的加载器去执行.
  2. 如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终 将到达顶层的启动类加载器.
  3. 如果父类加载器可以完成类的加载任务,就成功返回,倘若父类加载器无法完 成加载任务,子加载器才会尝试自己去加载,这就是双亲委派机制. 如果均加载失败,就会抛出 ClassNotFoundException 异常。

工作原理简述:

类的加载时按需加载,使用时才会加载.

类加载时,加载器都会将类交给父级类加载器加载.

如果所有的父级加载没有找到类,

则一级一级的向下委派查找.

如果都找不到,那么就会抛出异常.

思考:

我们自己创建一个名为 java.lang 的包,再创建一个名为 String 的类,当我们 new String()时,会将加载创建核心类库中的 String 对象还是创建我们自己创建的 String 类对象?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nWAQvD14-1678444842428)(C:\Users\封纪元\AppData\Roaming\Typora\typora-user-images\1641738456065.png)]

答:答案是这段代码并不能被执行,由于双亲委派机制在类的加载时会应用程序加载类会一级一级的向上寻找最后,由于java类库中不了你来就存在这个包这个类所以它就被java类库中的String给覆盖了故执行的还是原java类库的String 故这段大吗不能被执行 加载的是核心类库中的String对象

2.6类的主动/被动使用

JVM 规定,每个类或者接口被首次主动使用时才对其进行初始化,有主动使用,自然就有被动使用.

主动使用:

  • 通过new关键字被导致类的初始化,这是大家经常使用的初始化一个类的方式,他肯定会导致类的加载并且初始化
  • 访问类的静态变量,包括读取和更新
  • 访问类的静态方法
  • 对某个类进行反射操作,会导致类的初始化
  • 初始化子类会导致父类的的初始化
  • 执行该类的 main 函数

被动使用:

其实除了上面的几种主动使用其余就是被动使用了

1.引用该类的静态常量,注意是常量,不会导致初始化,但是也有意外,这里的常量是指已经指定字面量的常量,对于那些需要一些计算才能得出结果的常量就会导 致初始化,比如:

public final static int NUMBER = 5 ; //不会导致类初始化,被动使用

public final static int RANDOM = new Random().nextInt() ; //会导致类的初始化,主动使用

2.构造某个类的数组时不会导致该类的初始化,比如:

Student[] students = new Student[10] ;

主动使用和被动使用的区别在于类是否会被初始化

相关文章:

JVM结构-类加载(类加载子系统,类加载的角色,类加载的过程,类加载器分类,双亲委派机制,类的主/被动使用)

JVM 结构-类加载2.1类加载子系统2.2类加载的角色2.3类加载的过程2.3.1加载2.3.2链接2.3.3初始化2.4类加载器分类2.4.1 引导类加载器2.4.2扩展类加载器2.4.3应用程序类加载器2.5双亲委派机制2.6类的主动/被动使用2.1类加载子系统 类加载器子系统负责从文件系统或者网络中加载 cl…...

vcpkg私有port的创建和使用

1,准备环境: 系统:windows 系统 2, 安装vcpkg 步骤一 :先git clone下载下来vcpkg文件夹 命令:git clone “https://github.com/Microsoft/vcpkg.git” 步骤二:添加vcpkg环境变量 例如下载目录:D:\woker_zj 步骤三:编译vcpkg 操作:双击bootstrap-vcpkg.bat 步骤四: 为…...

LeetCode——203. 移除链表元素

对于初学链表的学者来学&#xff0c;链表是比较困难的&#xff0c;这部分对指针结构体的要求比较高。我们通过练习是掌握知识的重要途经203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09;我们在数组中去除某元素是遍历一遍数组&#xff0c;如果某位置是要去除的元素&a…...

[Java Web]Request对象 | 超1w字带你熟悉Servlet中的request请求

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;输出优质文章 ⭐所属专栏&#xff1a;Java Web ⭐如果觉得文章写的不错&#xff0c;欢迎点个关注&#x1f609;有写的不好的地方也欢迎指正&#xff0c;一同进步&#x1f601; 目录 Reque…...

求一个补码表示数的原始值的三种方式

求一个补码表示数的原始值的三种方式假设 a(10010)2′complement−14a (10010)_{2complement}-14a(10010)2′complement​−14 方式1&#xff0c;通过补码求原始值公式求值&#xff08;see article&#xff09; x−xM−1∗2M−1∑i0M−2xi∗2ix-x_{M-1}*2^{M-1}\sum_{i0}^{M-2…...

【计算机组成原理】

第2章 运算方法和运算器 2.1 数据与文字的表示方法 2.1.1 数据格式 定点数的表示方法 定点纯小数纯小数表示范围定点纯整数定点表示法特点 浮点数的表示方法&#xff1a; 浮点的规格化表示&#xff1a;阶码、尾数、指数、基数IEEE754标准&#xff1a;单精度、双精度浮点数表…...

论文分享:图像识别与隐私安全

1、基于差分隐私框架的频域下人脸识别隐私保护算法Privacy-Preserving Face Recognition with Learnable Privacy Budget in Frequency Domain2、一种基于视觉密码学和可信计算的无密钥依赖的医学图像安全隐私保护框架A Privacy Protection Framework for Medical Image Securi…...

计算机基础小结

目录 ❤ 计算机基础编程 什么是编程语言? 什么是编程? 为什么要学习编程? ❤ 计算机组成原理 控制器 运算器 储存器 内存(主存) 外存 输入设备 输出设备 适配器 总线 机械硬盘 固态硬盘 ❤ 计算机操作系统 什么是操作系统? 什么是文件? 什么是应…...

Linux服务器还有漏洞?建议使用 OpenVAS 日常检查!

几乎每天都会有新的系统漏洞产生&#xff0c;系统管理员经常忙于管理服务器&#xff0c;有时候会忽略一些很明显的安全问题。扫描 Linux 服务器以查找安全问题并不是很简单的事情&#xff0c;所以有时候需要借助于一些专门的工具。 OpenVAS 就是这样一种开源工具&#xff0c;它…...

【Redis】P1 Redis - NoSQL

Redis - NoSQLSQL 与 NoSQL差别一&#xff1a;结构化 与 非结构化差别二&#xff1a;关联性 与 非关联性差别三&#xff1a;规范化查询语句 与 非规范化差别四&#xff1a;事务 与 无事务差别五&#xff1a;磁盘存储 与 内存存储RedisRedis 的安装当前数据库存储主要分为 关系型…...

Angular学习之ControlValueAccessor接口详解

ControlValueAccessor 是什么&#xff1f;为什么需要使用 &#xff1f;下面本篇文章就来带大家了解Angular中的ControlValueAccessor组件接口&#xff0c;希望对大家有所帮助&#xff01; ControlValueAccessor 是什么&#xff1f; 简单来说ControlValueAccessor是一个接口&am…...

【GORM】高级查询方案

【GORM】高级查询方案1.Struct & Map查询为空的情况2.FirstOrInit3.FirstOrCreate4.高级查询1.Struct & Map查询为空的情况 当通过结构体进行查询时&#xff0c;GORM将会只通过非零值字段查询&#xff0c;这意味着如果你的字段值为0&#xff0c;‘’&#xff0c;false…...

MFC 简单使用事件

功能三个按钮,一个静态框,默认值是0,增加减少按钮和退出按钮.增加减少按钮显示在静态框中.退出按钮退出软件.实验事件思路新建三个事件,add事件sub事件quit事件,一个按钮触发一个事件,静态框新建一个线程接受事件做出对应的改变.UI添加的代码就不具体说,具体说下事件的代码,这才…...

华为OD机试题 - 端口合并(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:端口合并题目输入输出示例一输入输出说明示例二输入输出说明示例…...

ECharts数据可视化--常用图表类型

目录 一.柱状图 1.基本柱状图 1.1最简单的柱状图 ​编辑 1.2多系列柱状图 1.3柱状图的样式 &#xff08;1&#xff09;柱条样式 &#xff08;2&#xff09;柱条的宽度和高度 &#xff08;3&#xff09;柱条间距 &#xff08;4&#xff09;为柱条添加背景颜色 ​编辑 2.堆…...

Flutter面试题解析-GridView详解与应用

一、前言Flutter 作为时下最流行的技术之一&#xff0c;凭借其出色的性能以及抹平多端的差异优势&#xff0c;早已引起大批技术爱好者的关注&#xff0c;甚至一些 闲鱼 &#xff0c; 美团 &#xff0c; 腾讯 等大公司均已投入生产使用。虽然目前其生态还没有完全成熟&#xff0…...

最全的论文写作技巧(建议收藏)

近10年来&#xff0c;笔者有幸多次参与教学论文的评审工作&#xff0c;在此&#xff0c;特将教学论文写作的步骤及相关问题整理汇总如下&#xff1a; 一、选定论题 &#xff08;一&#xff09;论题在文中的地位与作用 严格地讲&#xff0c;论文写作是从选定论题开始的。选题…...

面向对象设计模式:设计模式分类(创建型、行为型、结构型)

1. 创建型设计模式 单例模式&#xff1a;https://blog.csdn.net/qq_44992559/article/details/129348686工厂模式&#xff1a;https://blog.csdn.net/qq_44992559/article/details/115222311抽象工厂模式&#xff1a;https://blog.csdn.net/qq_44992559/article/details/12934…...

MySQL数据库迁移

考试系统的数据库一直是在我自己的服务器上面的&#xff0c; 但是最近&#xff0c;自己的服务器马上要过期了&#xff0c;里面的MySQL数据需要迁移出来&#xff0c;放在另外一个服务器上面。百度了几篇教程&#xff0c;也没研究太多&#xff0c;选了一种比较简单的方式进行迁移…...

Docker:关于 Dockerfile 编写优化的一些笔记整理

写在前面 分享一些 Dickerfile 构建镜像优化方式的笔记理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃避方式&#…...

个性化营销:您需要知道的信息

个性化营销在现代企业中风靡一时。我们将剖析您需要了解的有关个性化营销的信息&#xff0c;一起来了解一下吧。 什么是个性化营销&#xff1f; 个性化营销是一种一对一营销形式&#xff0c;它使用实时用户数据和分析来传递品牌信息并针对特定潜在客户。 它与传统营销不同&…...

栈和队列的相互实现

文章目录一、用栈实现队列入队&#xff1a;出队&#xff1a;Java代码实现&#xff1a;二、用队列实现栈入栈&#xff1a;出栈&#xff1a;Java代码实现&#xff1a;附&#xff1a;C版代码1、用栈实现队列2、用队列实现栈栈&#xff08;stack&#xff09;&#xff1a;先进后出&a…...

iTab新标签页重磅更新 |这些功能绝对有你想要的新体验!

01 写在前面 csdn的朋友们&#xff0c;你好哦&#xff0c;我是iTab 插件的独立开发者&#xff0c;今天给大家安利一下我做的这款桌面插件。 首先要告诉大家一个好消息&#xff1a; 最近iTab新标签页被Edge 浏览器商店官方热门&#x1f525;推荐啦。 在此&#xff0c;特别感谢…...

【改机教程】iOS系统去除小黑条,改拍照声、拨号音、键盘音,不用越狱,支持所有机型

大家好&#xff0c;上次给大家分享了几个iOS系统免越狱改机教程 今天带来最新的教程&#xff0c;这次修改利用的是同一个漏洞&#xff0c;由外网大神 tamago 开发&#xff0c;国内大神冷风 进行汉化和优化 可以修改的地方包括 去除底部小黑条 dock栏透明 桌面文件夹透明 桌面…...

Android10开机向导中复用设置中的Wifi界面

很多时候我们需要定制开机向导&#xff0c;在开机向导界面我们一般会实现联网和设置时间等功能&#xff0c;考虑复用与稳定性问题&#xff0c;我们最好复用设置中的WiFi设置和日期设置。但是设置中的wifi设置界面默认是没有下一步按钮的&#xff0c;这会让用户感觉很奇怪。在以…...

川农机械专业小伙转行Java开发,年薪20w

本期学员就业故事&#xff0c;知了姐邀请到一位“特别”的同学&#xff0c;一位从知了堂就业成功近两年的学员再度接受我们的采访。 来自四川农业大学的曾同学&#xff0c;一个本来学机械开挖掘机的粗犷男人&#xff0c;因为不断地努力学习编程&#xff0c;最终成为一个性格闷…...

华为OD机试题 - 打印文件(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:打印文件题目输入输出示例一输入输出示例二输入输出Code代码解析…...

免费常用API大全,程序员必备

淘宝接口 淘宝开放平台 http://open.taobao.com/?spma219a.7395905.1.1.YdFDV6 APISpace 生活常用 今天吃什么&#xff1a;随机返回一顿美味食物&#xff0c;解决你今天吃什么的难题。 星座查询&#xff1a;根据日期或星座名称&#xff0c;查询星座详细信息&#xff0c;包…...

MySQL主从复制,读写分离

目录 一、MySQL主从复制介绍 MySQL复制过程分成三步 二、主库配置master 1、步骤1 2、第二步:重启Mysql服务 3、第三步&#xff1a;登录Mysql数据库&#xff0c;执行下面SQL 4、第四步&#xff1a;登录Mysql数据库&#xff0c;执行下面SQL&#xff0c;记录下结果中File和…...

什么是UEFI签名认证?UEFI签名有什么好处?

为了防御恶意软件攻击&#xff0c;目前市面上所有电脑设备启动时默认开启安全启动(Secure Boot)模式。安全启动(Secure Boot)是UEFI扩展协议定义的安全标准&#xff0c;可以确保设备只使用OEM厂商信任的软件启动。UEFI签名认证就是对运行在 UEFI 系统下的 efi 驱动和通过 UEFI …...

国外免费logo设计网站/烘焙甜点培训学校

诺基亚又一次吸引了众人的眼球&#xff0c;处在风口浪尖的诺基亚做出了一系列艰难的决定&#xff1a;公司昨日宣布将在2013年年底最多全球裁员1万人&#xff0c;削减16亿欧元支出&#xff1b;并宣布对管理层进行重新洗牌&#xff0c;首席营销官Jerri DeVard、手机部门负责人Mar…...

南昌做网站哪个公司好/关键词可以分为哪三类

1、我们应该崇尚一种自信、自助、自立、自制的生活&#xff01; 2、我们应该做这样的人&#xff0c;敢于直面自然和生命&#xff0c;追求人格的独立与完整&#xff0c;这样&#xff0c;我们就会觉得生活很充实&#xff0c;很自然。 3、保持平静&#xff0c;你就能征服每一个人。…...

山大优秀网站建设2018年度/竞价推广平台有哪些

作者:GWD 时间&#xff1a;2019.8.27 1、驱动的框架 C库根据不同的swi值进入内核调用sys_open、open_read函数。 2、应用程序怎么和我们的设备对应起来 答&#xff1a;驱动设备框架...

集团网站建设方案/seo排名点击首页

文章目录一&#xff1a;范数对比二&#xff1a;范数作用三&#xff1a;L0范数和L1范数之间的比较四&#xff1a;L1范数和L2范数的比较五&#xff1a;L1范数和L2范数之反向传播的理解一&#xff1a;范数对比 L0范数: 指向量中非0的元素的个数。(L0范数很难优化求解) L1范数: 指…...

温州学校网站建设/公司宣传网页怎么做

被称为Badlock的新漏洞引发专家漏洞披露的争论。对Windows和Samba中这个关键安全漏洞的修复今日才发布&#xff0c;而有关该漏洞的新闻三周前就被公布了&#xff0c;由德国安全咨询公司SerNet公布。 该漏洞由SerNet公司Samba长期开发人员Stefan Metzmacher发现&#xff0c;根据…...

广州自助公司建网站/seo牛人

近期做项目调研的时候刚刚好需要用到图像匹配相关的算法,因此在这里做下记录。 相近图像的匹配,其实归根结底只有一个目的,就是找到两张图像中反映相同现实位置的几个像素点,然后获得到这些像素点的坐标,以供后面仿射变换等算法进行处理。 其基本思路如下: 1. 检…...