JVM之class加载过程

news2025/3/1 15:06:33

一、定义:

java虚拟机把描述类的数据从class文件加载到内存,并对数据进行 校验/准备/解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。

称作虚拟机的类加载机制。

loading -> linking (verification -> preparation -> resolution)-> resolution)->initializing

loading: 把class文件load到内存中,采用双亲委派,主要是为了安全性

verification: 校验class文件是否符合标准

preparation: 静态变量分配内存并设初始值的阶段(不包括实例变量)

resolution:把符号引用转换为直接引用

initializing:静态变量赋初始值

二、加载过程:

类加载的过程主要分为三个部分:加载、连接、初始化这三个阶段。

1、加载阶段

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个这个类的java.lang.Class对象,用来封装类在方法区类的对象。主要步骤可以分为下面的三件事情:

  1. 通过一个类的全限定名来获取其定义的二进制字节流。

  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

  3. 在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口。

加载阶段完成后,虚拟机外部的 二进制字节流就按照虚拟机所需的格式存储在方法区之中,而且在Java堆中也创建一个java.lang.Class类的对象,这样便可以通过该对象访问方法区中的这些数据。

类的加载的最终产品是位于堆区中的Class对象。Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。加载类的方式有以下几种:

  1. 从本地系统直接加载

  2. 通过网络下载.class文件

  3. 从zip,jar等归档文件中加载.class文件

  4. 从专有数据库中提取.class文件

  5. 将Java源文件动态编译为.class文件(服务器)

2.加载器

JVM的类加载是通过ClassLoader及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:

1.BootstrapClassLoader(启动类加载器)

  • 负责加载JAVAHOME中jre/lib/rt.jar里所有的class,加载System.getProperty(“sun.boot.class.path”)所指定的路径或jar。</p></li><li><p>ExtensionClassLoader(标准扩展类加载器)负责加载java平台中扩展功能的一些jar包,包括JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包。载System.getProperty(“java.ext.dirs”)所指定的路径或jar。

  • AppClassLoader(系统类加载器)负责记载classpath中指定的jar包及目录中class CustomClassLoader(自定义加载器)属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现。

  • 2.类加载器的顺序 加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。

  • 在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载。

  • Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null。

2、连接阶段:

在连接里面又可以被分成3个小阶段,分别是:验证,准备,解析

1.验证(目的):

  • 主要是为了保证加载进来的字节流符合虚拟机规范,不会造成安全错误。

  • 包括对于文件格式的验证,比如常量中是否有不被支持的常量?文件中是否有不规范的或者附加的其他信息?

  • 对于元数据的验证,比如该类是否继承了被final修饰的类?类中的字段,方法是否与父类冲突?是否出现了不合理的重载?

  • 对于字节码的验证,保证程序语义的合理性,比如要保证类型转换的合理性。

  • 对于符号引用的验证,比如校验符号引用中通过全限定名是否能够找到对应的类?校验符号引用中的访问性(private,public等)是否可被当前类访问?

2.验证内容:

验证是连接阶段的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。验证阶段大致会完成4个阶段的检验动作:

  • 文件格式验证:验证字节流是否符合Class文件格式的规范;例如:是否以0xCAFEBABE开头、主次版本号是否在当前虚拟机的处理范围之内、常量池中的常量是否有不被支持的类型。

  • 元数据验证:对字节码描述的信息进行语义分析(注意:对比javac编译阶段的语义分析)

  • 以保证其描述的信息符合Java语言规范的要求;例如:这个类是否有父类,除了java.lang.Object之外。

  • 字节码验证:通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的,如循环、分支等

  • 符号引用验证:确保解析动作能正确执行,比如不能访问引用类的私有方法、全限定名称是否能找到相关的类。

验证阶段是非常重要的,但不是必须的,它对程序运行期没有影响,如果所引用的类经过反复验证,那么可以考虑采用-Xverifynone参数来关闭大部分的类验证措施,以缩短虚拟机类加载的时间。

3.准备:

在准备阶段,为静态变量的初值为jvm默认的初值,而不是我们在程序中设定的初值。jvm默认为静态变量的初值是这样的

  • 静态变量是基本类型(int、long、short、char、byte、boolean、float、double)的默认值为0

  • 静态变量时引用类型的默认值为null

  • 被final和static共同修改的静态变量,我们通常称为常量,然后常量的默认值为我们程序中设定的值,

  • 比如我们在程序中定义final static int a = 100,则准备阶段中a的初值就是100。

4.解析:

这一阶段的任务就是把常量池中的符号引用转换为直接引用 什么是符号引用,什么是直接引用。

  • 符号引用:即一个字符串,但是这个字符串给出了一些能够唯一性识别一个方法,一个变量,一个类的相关信息。

  • 直接引用:可以理解为一个内存地址,或者一个偏移量。比如类方法,类变量的直接引用是指向方法区的指针。

  • 在解析阶段,虚拟机会把所有的类名,方法名,字段名这些符号引用替换为具体的内存地址或偏移量,也就是直接引用。

  • 举个例子来说,现在调用方法hello(),这个方法的地址是1234567,那么hello就是符号引用,1234567就是直接引用。

3、初始阶段:

1.工作内容:

JVM负责主要对类变量(类变量就是static修改的变量)进行初始化这里主要对类变量(类变量就是static修改的变量)进行初始化,初始化主要有两个方式:

  • 声明静态类变量时指定初始值

  • 使用静态代码块为类变量指定初始值

2.初始化时机:

类初始化时机:只有当对类的主动使用的时候才会导致类的初始化,类的主动使用包括以下六种:

  1. 创建类的实例,也就是new的方式

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

  3. 调用类的静态方法

  4. 反射(如Class.forName(“com.shengsiyuan.Test”))

  5. 初始化某个类的子类,则其父类也会被初始化

  6. Java虚拟机启动时被标明为启动类的类(Java Test),直接使用java.exe命令来运行某个主类

3.初始化顺序:

  • 如果这个类还没有被加载和链接,那先进行加载和链接

  • 假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)

  • 加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句。

如果有父类,则顺序是:父类static方法/static变量赋值 –> 子类static方法/static变量赋值

三、结语:

上面介绍的就是类(class)的加载,包含它的加载、链接、初始化。

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

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

相关文章

南卡和FIIL蓝牙耳机哪个比较好?数码达人深度对比评测

2023即将到来&#xff0c;蓝牙耳机对于大部分人来说&#xff0c;成为了越来越重要的存在。日常生活中随处可见的都是在使用蓝牙耳机的人&#xff0c;有听歌的、看剧的、玩游戏的等等。伴随着更多的人使用蓝牙耳机&#xff0c;市面上可见的蓝牙耳机数量正在飙升&#xff0c;这也…

MySQL 的自增主键一定是连续的吗?

全文摘要&#xff1a;结合实例分析了自增值保存在哪里&#xff0c;自增值的修改策略&#xff0c;以及自增值不连续的四个场景&#xff0c;希望对各位小伙伴们有所帮助~ 众所周知&#xff0c;自增主键可以让聚集索引尽量地保持递增顺序插入&#xff0c;避免了随机查询&#xff…

微软确认配置错误导致65,000多家公司的数据泄露

©网络研究院 微软证实&#xff0c;在安全漏洞导致端点无需任何身份验证即可通过互联网公开访问后&#xff0c;它无意中暴露了与数千名客户相关的信息。 微软在警报中表示&#xff1a; “这种错误配置可能导致未经身份验证访问与微软和潜在客户之间的交互相对应的一些业务…

互联网大厂Java岗考点(阿里+百度+腾讯+字节跳动+美团+京东)

本文扼要 本文结构主要分为以下三个部分&#xff1a; 01 互联网大厂考点&#xff08;阿里百度腾讯字节跳动美团京东&#xff09;02 Java 面试考点大全&#xff08;基本功底常用技术技术深度技术经验学习能力工作能力项目经验&#xff09;03 面试真题重现 01 互联网大厂考点 …

OPSS-PEG-N3叠氮聚乙二醇巯基吡啶, N3-PEG-OPSS,点击化学PEG试剂

名称 叠氮聚乙二醇巯基吡啶 N3-PEG-OPSS 中文名称 叠氮PEG巯基吡啶 巯基吡啶PEG叠氮 巯基吡啶聚乙二醇叠氮 英文名称 N3-PEG-OPSS OPSS-PEG-N3 Azide-PEG-OPSS OPSS-PEG-Azide 溶剂 溶于二氯甲烷&#xff0c;氯仿&#xff0c;乙酸乙酯&#xff0c;四氢呋喃等有机溶剂 存储条…

pycharm安装使用pyQt5

一、创建项目 二、安装pyqt5库 三、配置PyCharm外部工具 打开File->settings->Tools->External Tools 1、配置QtDesigner 程序&#xff1a;D:\python3.7\Lib\site-packages\qt5_applications\Qt\bin\designer.exe//安装包的时候回自动下载&#xff0c;直接在包文件…

【微服务技术09】统一网关Gateway

【微服务技术09】统一网关Gateway 案例代码&#xff1a;https://gitee.com/pikachu2333/spring-cloud-hexuan 网关作用 网关功能&#xff1a; 身份认证和权限校验服务路由、负载均衡请求限流 权限控制&#xff1a; 网关作为微服务入口&#xff0c;需要校验用户是是否有请求…

配置Typora

配置Typora 文章目录配置Typora阿里云1&#xff09;网页搜索阿里云OSS2&#xff09;注册账号3&#xff09;点击立刻开通a) 点击“产品价格”b) 初次付费c) 交钱以免造成后续无法访问d&#xff09;进入管理控制台e) 创建钥匙PicGo1&#xff09;下载安装2&#xff09;设置选择显示…

领域知识网络即服务:知识助力产业升级“无形的手”?

文|智能相对论 作者|叶远风 你用过ChatGPT了吗&#xff1f; 这个风靡全球的AI应用&#xff0c;以出圈的方式展现着AI的能量。 一个对话的界面&#xff0c;可以聊任何你想聊的话题&#xff0c;可以写出任何你想要的文字。 似乎有无限的人类知识&#xff0c;被集中到了一起&…

别再背锅了,这个小技巧统计第三方接口耗时很安逸

前言 之前我有写过一篇记录生产环境事故的文章&#xff0c;获得了不少好评。 后续&#xff0c;我们团队有做过一些讨论&#xff0c;为了支撑运营维护&#xff0c;搭建了更好的日志平台GranfaLoki&#xff0c;也引入了SkyWalking做链路追踪。 但过程中也遇到了一些问题&#xff…

26个工业废水处理工艺流程图!水处理从业人员必看

1 矿泉水除溴酸盐工艺流程 季胺1型官能团耐受硫酸盐、氯离子等去除溴化物 2 电厂制备超纯水工艺流程 内冷水系统降电导装置&#xff0c;脱除阴阳离子 电导率&#xff1c;1μs/cm 3 锰矿除氨氮工艺流程 两串一备&#xff0c;通过磺酸基官能团捕捉铵根离子 4 垃圾渗滤液除氨…

5-7:Spring整合Elasticsearch

引入依赖 spring-boot-starter-data-elasticsearch 配置Elasticsearchcluster-name、cluster-nodes. Spring Data Elasticsearch ElasticsearchTemplateElasticsearchRepository 实现对帖子的搜索&#xff0c;将帖子的数据存到ES中 EslaticSearch使用 下载依赖 <!-- htt…

Elasticsearch:基于文件的用户认证

你可以使用内置文件域&#xff08;file realm&#xff09;管理和验证用户。 使用文件域&#xff0c;用户在集群中每个节点上的本地文件中定义。 重要&#xff1a;作为集群的管理员&#xff0c;你有责任确保在集群中的每个节点上定义相同的用户。 Elastic Stack 安全功能不提供任…

C++ Reference: Standard C++ Library reference: Containers: map: map: erase

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/erase/ 公有成员函数 <map> std::map::erase C98 (1) void erase (iterator position); (2) size_type erase (const key_type& k); (3) void erase (iterator first, iterator last);…

HR是怎么看待PMP证书呢?

HR 也是打工人&#xff0c;企业需要什么样的人才就招聘什么样的求职者&#xff0c;问 HR 怎么看待 PMP 证书&#xff0c;其实也就是PMP 证书的市场价值怎么样。 市场上对PMP证书的评价争议非常大&#xff0c;尤其近两年考 PMP 的人越来越多&#xff0c;不可否认&#xff0c;很…

UNIAPP实战项目笔记52 输入手机号页面和输入验证码页面

UNIAPP实战项目笔记52 输入手机号页面和输入验证码页面 实际案例图片 输入手机号页面 输入验证码页面 显示输入手机号 使用验证码登录 具体内容图片自己替换哈&#xff0c;随便找了个图片的做示例 具体位置见目录结构 完善布局页面和样式 代码 login-tel.vue页面 <templat…

33-Vue之ECharts-仪表盘图

ECharts-仪表盘图前言仪表盘的特点仪表盘的基本实现仪表盘的常见效果前言 本篇来学习写仪表盘图 仪表盘的特点 可以更直观的表现出某个指标的进度或实际情况 仪表盘的基本实现 ECharts 最基本的代码结构准备数据, 设置给 series 下的 data在 series 下设置 type:gauge &l…

毕业设计-国内疫情数据综合可视化分析系统

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

关于websocket抓包时的注意事项

总是需要一些原因&#xff0c;需要查看客户端和服务端的websocket数据交互&#xff0c;为了使得查看方便&#xff0c;客户端和服务端使用ws而非wss。 服务端部署在linux上&#xff0c;用tcpdump抓包后&#xff0c;在windows上用wireshark打开&#xff0c;如下所示&#xff1a; …

前端基础(十)_标签分类(行级标签、块级标签、行块标签)

标签分类 可以分为三类&#xff1a;行级标签、块级标签、行块标签 行级元素 常用的行级元素&#xff1a;span、b、i、em、strong、a、del、sub、sup等 注意&#xff1a; 1、默认宽度随元素的内容的变化而变化&#xff1b; 2、默认情况下高度由内容撑开&#xff1b; 3、不会…