浅谈 JVM 类加载过程

🚗🚗🚗今天给大家分享的是HTTPS加密的工作过程。

清风的CSDN博客

🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流!

✈️✈️✈️动动你们发财的小手,点点关注点点赞!在此谢过啦!哈哈哈!😛😛😛 

目录

一、JVM类加载总体了解 

二、加载  

 三、连接

3.1 验证 

3.2 准备 

3.3 解析

四、初始化 

 五、类加载过程中的双亲委派模型

5.1 什么是双亲委派模型

5.2 双亲委派模型对类加载的基本描述流程 

5.3 双亲委派模型的优点 


一、JVM类加载总体了解 

5 步是固定的顺序并且也是类加载的过程,其中中间的 3 步都属于连接,所以对于类加载来说总共分为以下几个步骤:
  • 加载
  • 连接(验证、准备、解析)
  • 初始化

下面我们分别来看每个步骤的具体执行内容。

二、加载  

加载 Loading )阶段是整个 类加载 Class Loading )过程中的一个阶段,它和类加载 Class
Loading 是不同的,一个是加载 Loading , 另一个是类加载 Class Loading,所以不要把二者搞混了。

在加载 Loading 阶段,Java虚拟机需要完成以下三件事情:

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

 三、连接

3.1 验证 

验证是连接阶段的第一步,这一阶段的目的是确保 Class 文件的字节流中包含的信息符合《 Java 虚拟机规范》的全部约束要求,保证这些信 息被当作代码运行后不会危害虚拟机自身的安全。

验证选项: 文件格式验证、字节码验证、符号引用验证...

3.2 准备 

准备阶段是正式为类中定义的变量(即静态变量,被 static 修饰的变量)分配内存并设置类变量初始值的阶段。

 比如此时有这样一行代码:

public static int value = 123;

 它是初始化 value int 值为 0,而非 123

3.3 解析

解析阶段是 Java 虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程。

四、初始化 

初始化阶段, Java 虚拟机真正开始执行类中编写的 Java 程序代码,将主导权移交给应用程序。初始化阶段就是执行类构造器方法的过程。

总结: 

Java程序最开始是一个 .Java 文件,经过编译成了 .class文件(字节码文件)。运行Java程序,JVM就会读取 .class 文件,把文件内容放到内存中,并且构造成 .class 对象。(类对象)

①加载:找到 .class 文件,打开文件读取内容,尝试解析格式。

②验证:检查一下当前 .class 文件的格式是否符合要求。

③准备:给类对象分配内存,并 “初始化”。

④解析:针对字符串常量的初始化。

⑤初始化:对类对象进行更具体的初始化操作。初始化静态成员、执行静态代码块、加载父类。

 五、类加载过程中的双亲委派模型

5.1 什么是双亲委派模型

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

  • 启动类加载器:加载 JDK lib 目录中 Java 的核心类库,即$JAVA_HOME/lib目录。 扩展类加载器。加载 lib/ext 目录下的类。
  • 应用程序类加载器:加载我们写的应用程序。
  • 自定义类加载器:根据自己的需求定制类加载器。

5.2 双亲委派模型对类加载的基本描述流程 

  • BootStrap ClassLoader : 负责加载标准库中的类
  • Extension ClassLoader : 负责加载 JVM 扩展的库
  • Application ClassLoader : 负责加载第三方库
  • 从 Application ClassLoader 开始,不会立即就搜索第三方库的目录,而是先把加载任务委派给父类加载器,让父类尝试加载。
  • 到了 Extension ClassLoader ,也是把加载任务委派给父类加载器,让父类尝试加载。
  • 最后,到了 BootStrap ClassLoader , 也不想立即搜索标准库,但是它没有父类加载器,只能自己动手。如果找到了要搜索的类,就执行后续加载(就用不着下面的两个子类加载器了)。如果没找到,任务就会交给子类加载器。
  • 此时任务回到了 Extension ClassLoader,就会搜索扩展库的目录,看是否有 .class 文件。若找到,执行后续加载。否则把任务交给子类加载器。
  • 任务又回到了 Application ClassLoader ,就要搜索第三方库的目录,(往往是我们自己项目的目录) ,如果找到,执行后续加载,否则抛出一个异常。

这样做的目的,就是明确优先级,避免程序员的代码对标准库的代码产生负面影响。 

那么一个类在什么时机会被加载呢?

  • ①构造类的实例。
  • ②使用类的静态方法/属性。
  • ③子类的加载触发了父类的加载。

类加载之后,后续使用就不必加载了,类对象已经是现成的了。 

5.3 双亲委派模型的优点 

  • 避免重复加载类:比如 A 类和 B 类都有一个父类 C 类,那么当 A 启动时就会将 C 类加载起来,那么在 B 类进行加载时就不需要在重复加载 C 类了。
  • 安全性:使用双亲委派模型也可以保证了 Java 的核心 API 不被篡改,如果没有使用双亲委派模型,而是每个类加载器加载自己的话就会出现一些问题,比如我们编写一个称为 java.lang.Object 类的话,那么程序运行的时候,系统就会出现多个不同的 Object 类,而有些 Object 类又是用户自己提供的因此安全性就不能得到保证了。

✨好啦,今天的分享就到这里!

🎉希望各位看官读完文章后,能够有所提升。

✨创作不易,还希望各位大佬支持一下!

👍点赞,你的认可是我创作的动力!

⭐收藏,你的青睐是我努力的方向!

✏️评论:你的意见是我进步的财富!

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

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

相关文章

SQL Server从0到1——写shell

xp_cmdshell 查看能否使用xpcmd_shell; select count(*) from master.dbo.sysobjects where xtype x and name xp_cmdshell 直接使用xpcmd_shell执行命令: EXEC master.dbo.xp_cmdshell whoami 发现居然无法使用 查看是否存在xp_cmdshell: EXEC…

如何在群晖7.2中运行WPS Office镜像容器并使用固定地址公网访问

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本,通过…

数据结构与算法教程,数据结构C语言版教程!(第二部分、线性表详解:数据结构线性表10分钟入门)九

第二部分、线性表详解:数据结构线性表10分钟入门 线性表,数据结构中最简单的一种存储结构,专门用于存储逻辑关系为"一对一"的数据。 线性表,基于数据在实际物理空间中的存储状态,又可细分为顺序表&#xff…

解决pip安装第三库echarts报错:Package would be ignored而安装失败的问题

现象: 尝试了很多方法都没解决 ,最后终于突然灵光一闪找到原因(我这是python虚拟环境,创建的时候会自动升级pip) 原因: pip版本过高! 想不到是这原因吧! 解决办法:手动…

主线程退出后子线程是否还会正常运行?

问题: 父子线程的关系 今天突然有感而发, 想要来探讨一下主线程和子线程之间的关系。 例一:子线程执行时间较父线程慢 public class ThreadTest {public static void main(String[] args) {// 测试主线程 和 子线程Thread sonThread new …

STM32 HAL库定时器触发DMA并口数据传输

代码目的: STM32与FPGA通讯,通过8位并口线进行通讯,16byte的数据在10us之内通过8位并口数据线传给FPGA,FPGA读取该数据。 HAL库设置说明: 时钟采用80MHz,由于16byte的数据要在10us之内传完,那…

《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(8)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(7) 2.2 HOST主桥 MPC8548处理器的拓扑结构如图2-2所示: 2.2.2 存储器域地址空间到PCI总线域地址空间的转换 MPC8548处理器使用ATMU&#xff…

协程池与新脚本语言

今天的主人公名为——Melang。 这是一款使用C语言开发的“新”的脚本语言,然而其已经默默问世了6年之久。 下面笔者就带你走进Melang world。 What is Melang Melang是一款协程并发脚本语言。它是一款解释型,而非编译型语言。 在Melang中&#xff…

计算机网络期末知识汇总

一、计算机网络概述 1.Internet 的中文译名并不统一。 现有的 Internet 译名有两种: 因特网,这个译名是全国科学技术名词审定委员会推荐的,但却长期未得 到推广; 互联网,这是目前流行最广的、事实上的标准译名。现…

如何在 iPhone 上检索已删除的短信:6个有效方法分享

您是否错误地删除了 iPhone 上的重要短信?或者您可能删除了“消息”应用程序中的整个对话并想将其恢复?无论您的情况如何,有一些数据恢复方法可以帮助您恢复 iPhone 上已删除的邮件。 在本文中,我们将介绍在 iPhone 上恢复丢失、…

大数据 MapReduce如何让数据完成一次旅行?

专栏上一期我们聊到MapReduce编程模型将大数据计算过程切分为Map和Reduce两个阶段,先复习一下,在Map阶段为每个数据块分配一个Map计算任务,然后将所有map输出的Key进行合并,相同的Key及其对应的Value发送给同一个Reduce任务去处理…

idea 以文本形式输出 SpringBoot项目 目录结构

第1步:AltF12 打开 Terminal 终端 第2步:cd 到 项目路径下 第3步:使用 tree 命令 结果 D:. ├─.mvn │ └─wrapper ├─applog │ └─logs ├─src │ ├─main │ │ ├─java │ │ │ └─com │ │ │ └─zhangziwa …

【大数据进阶第三阶段之Hive学习笔记】Hive基础入门

目录 1、什么是Hive 2、Hive的优缺点 2.1、 优点 2.2、 缺点 2.2.1、Hive的HQL表达能力有限 2.2.2、Hive的效率比较低 3、Hive架构原理 3.1、用户接口:Client 3.2、元数据:Metastore 3.3、Hadoop 3.4、驱动器:Driver Hive运行机制…

设计模式之迭代器模式【行为型模式】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某…

【已解决】在开启ssh和sshd状态下,XShell无法连接到VMware虚拟机中的Linux操作系统

【已解决】在开启ssh和sshd状态下,XShell无法连接到VMware虚拟机中的Linux操作系统 XShell无法连接到VMware虚拟机中的Linux操作系统,今天上线突然发现XShell无法连接到VMware虚拟机中的Linux操作系统,但是找了很多解决方案都没有解决&#x…

快速排序挖坑法

我们先来感受一下挖坑法的思路: 经过上面的图片分析,我们可以感受到挖坑法和hoare版本并没有太多本质上的区别(hoare版本的思路及代码在我的上一篇博客已经写过,这里我就不再赘述了),只不过挖坑法似乎更易…

Qt添加资源文件

ui->setupUi(this);//1. 使用本地文件:ui->actionasdasdas->setIcon(QIcon("本地绝对路径"));ui->actiona1->setIcon(QIcon("C:/Users/满满/Desktop/output/picture/1.jpg"));//2. 使用资源文件:ui->actionasdasd…

网安入门10-文件上传(中国蚁剑)

​ 什么是文件上传漏洞——来自GPT-4 文件上传漏洞是一种常见的安全漏洞,它出现在Web应用程序中,允许攻击者上传恶意文件到服务器。这种漏洞可能导致严重的安全问题,例如服务器被入侵、数据泄露和应用程序功能受损。 文件上传漏洞通常由以…

【源码解析】Apache RocketMQ发送消息源码

send message源码解析 引入 send message方法作为我们经常使用的方法,平时我们很难去关注他底层到底做了什么。大部分人只知道通过send message方法可以将消息发送到broker,然后供消费者进行消费。其实不然,消息从客户端发送到broker&#x…

GPU的硬件架构

SM: streaming Multiprocessor 流多处理器 sm里面有多个(sp)cuda core 32个线程称为一个warp,一个warp是一个基本执行单元 抽象概念:grid 网格 block 块 thread 线程 块中的线程大小是有讲究的,关乎到资源的调度,一般是128&#x…