当前位置: 首页 > 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;是人的逃避方式&#…...

终极OFD转PDF指南:3分钟掌握免费开源转换工具Ofd2Pdf的完整教程

终极OFD转PDF指南&#xff1a;3分钟掌握免费开源转换工具Ofd2Pdf的完整教程 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf 你是否经常遇到OFD格式文件无法打开的困扰&#xff1f;无论是电子发票、政…...

CAJ转PDF神器:caj2pdf-qt让学术文献格式转换变得如此简单

CAJ转PDF神器&#xff1a;caj2pdf-qt让学术文献格式转换变得如此简单 【免费下载链接】caj2pdf-qt CAJ 转 PDF 转换器&#xff08;GUI 版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/ca/caj2pdf-qt 还在为CAJ格式的学术文献无法在手机、平板或其他设备上阅…...

NotebookLM Pro版到底贵在哪?——基于172小时真实工作流压测的TCO建模分析

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM Pro版到底贵在哪&#xff1f;——基于172小时真实工作流压测的TCO建模分析 在连续172小时跨时区协同实验中&#xff0c;我们部署了3类典型知识工作流&#xff1a;法律条文溯源分析、学术论文…...

AI智能体技能超市:用SKILL.md标准打破AI能力壁垒

1. 项目概述&#xff1a;一个为AI智能体准备的“技能超市” 如果你和我一样&#xff0c;每天都在和各种AI编程助手打交道——Cursor、Claude Code、GitHub Copilot&#xff0c;那你肯定也遇到过这样的场景&#xff1a;想让AI帮你生成一张产品原型图&#xff0c;结果它告诉你“我…...

Loop:基于Swift开发的macOS窗口管理框架解决方案

Loop&#xff1a;基于Swift开发的macOS窗口管理框架解决方案 【免费下载链接】Loop Window management made elegant. 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 在macOS桌面环境中&#xff0c;多窗口管理一直是效率工作流的关键瓶颈。传统的手动拖拽操作…...

pdf2pptx:LaTeX到PowerPoint的无缝转换终极方案

pdf2pptx&#xff1a;LaTeX到PowerPoint的无缝转换终极方案 【免费下载链接】pdf2pptx Convert your (Beamer) PDF slides to (Powerpoint) PPTX 项目地址: https://gitcode.com/gh_mirrors/pd/pdf2pptx 还在为LaTeX Beamer制作的精美学术幻灯片无法在PowerPoint中完美展…...

玩转OurBMC第二十六期:OpenBMC固件远程更新原理与实践(下)

栏目介绍&#xff1a;“玩转OurBMC” 是OurBMC社区开创的知识分享类栏目&#xff0c;主要聚焦于社区和BMC全栈技术相关基础知识的分享&#xff0c;全方位涵盖了从理论原理到实践操作的知识传递。OurBMC社区将通过 “玩转OurBMC” 栏目&#xff0c;帮助开发者们深入了解到社区文…...

Emacs集成ChatGPT:AI助手无缝融入编辑器工作流

1. 项目概述&#xff1a;在Emacs中集成ChatGPT的魔法工具作为一名在Emacs生态里摸爬滚打了十多年的老用户&#xff0c;我对于在编辑器里“折腾”各种生产力工具一直乐此不疲。当ChatGPT这类大语言模型&#xff08;LLM&#xff09;横空出世时&#xff0c;我的第一反应就是&#…...

电子测试安全:示波器浮地测量与隔离变压器应用全解析

1. 项目概述&#xff1a;一次关于测试测量安全的深度探讨又到了周五&#xff0c;对于很多工程师来说&#xff0c;这可能是最想摸鱼但又不得不处理手头棘手问题的一天。想象一下这个场景&#xff1a;你面前摆着一台直接从市电取电的设备&#xff0c;它的某个测试点对地可能有高达…...

CCM实战调校:从原理到精准色彩还原

1. 色彩校正矩阵&#xff08;CCM&#xff09;的核心原理 色彩校正矩阵&#xff08;CCM&#xff09;是图像处理流水线中一个关键的数学工具&#xff0c;它的主要作用是修正相机传感器捕获的颜色与实际场景颜色之间的偏差。想象一下&#xff0c;你用手机拍了一张草莓的照片&…...