看个电影就能学会类的加载过程?我不信!

2023-11-03 23:51

本文主要是介绍看个电影就能学会类的加载过程?我不信!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

O、前言

今天我们来了解一下关于类的加载过程,这个问题在面试过程中属于高频面试题了。

那么回答的时候,我们往往会采取死记硬背的方式,告诉面试官类的加载过程包括:加载验证准备解析初始化这5个阶段。

但是如果面试官继续问到,这5个步骤都具体做什么呢? 我们就回答不上来了。

那么今天,我们就通过和好朋友们一起去看电影的例子,来再次理解类的加载过程。

一、加载阶段

1.1> 故事描述

今天是一个阳光明媚的周末,你和几个关系很好的同事们一同相约去看《变形金刚》这部电影,由于这部电影上市以来异常火爆,所以电影院外面就挤满了人,为了保持安全和观影顺序,工作人员把大家安排成一排排的队列,依次的进入到电影院

1.2> 过程分析

当我们通过编写java源码然后将其编译为class文件的时候,需要JVM将class文件加载进来才能执行我们所编写的程序逻辑,就正如上面故事所述的——“大家依次的进入到电影院”中。其实也类似于我们要玩某款主机游戏,我们会将游戏光片放入到PS5的光驱中让其执行光盘的读取操作。

具体流程是,JVM通过类的全路径名称,获取类的二进制数据流。然后,解析类的二进制数据流,转化为方法区(永久代or元空间) 内部的数据结构。并且,创建java.lang.Class类的实例对象,用来表示该类型。

二、验证阶段

2.1> 故事描述

随着大家陆续的都进入到了电影院,那么为了保障观影安全,安保人员会对每一名来看电影的观众进行安全检查,比如:是否携带了易燃易爆的东西。

2.2> 过程分析

验证阶段的目从它的名字中就可以看得出来了,就是为了保证第一步中加载的字节码是合法且符合规范的

这个过程大致可以分为4种验证内容:

格式检查】检查魔数、版本、长度等等。
语义检查】抽象方法是否有实现类、是否继承了final类等等编码语义上的错误检查。
字节码验证】跳转指令是否指向正确的位置,操作数类型是否合理等。
符号引用验证】符号引用的直接引用是否存在

三、准备阶段

3.1> 故事描述

你和观影的小伙伴们都顺利的通过了安全检查,那么由于这部《变形金刚》购票的时候选择的是3D电影,所以,门口的服务员小姐姐非常贴心的为您提供了观影所需要的3D眼镜,此时,大家都录取的来领眼镜,为观影前做最后的准备工作

3.2> 过程分析

准备阶段是正式 为类变量分配内存 并设置类变量的 初始值 阶段,即:在方法区中分配这些变量所使用的内存空间。

注意这里所说的初始值概念,比如一个类变量定义为:public static int v = 8080; 实际上变量v在准备阶段过后的初始值为0而不是8080,将v赋值为8080的put static指令是程序被编译后存放于类构造器<client>方法之中

但是注意,如果声明为:public static final int v = 8080; 在编译阶段会为v生成ConstantValue属性,在准备阶段虚拟机会根据ConstantValue属性将v赋值为8080 。

四、解析阶段

4.1> 故事描述

领完3D眼镜,大家终于进入了电影院,根据电影票中写的x号厅x排x座,来寻找实际的座位,大家陆陆续续的都坐到了自己的座位上

4.2> 过程分析

解析阶段是指虚拟机将运行时常量池中的符号引用替换为直接引用的过程。

那么,什么是符号引用?什么是直接引用呢?

符号引用指的是描述性的引用关系,比如上面故事中的“电影票中写的x号厅x排x座”,它只进行了座位的描述,并不是实实在在的座位;

直接引用则对应真正的引用关系,即上面故事中电影票所对应的真实的座位

这一点,我们可以通过javap -verbose指令来更直观的看到符号引用。

五、初始化阶段

5.1> 故事描述

经过了上面的所有步骤,电影放映的时间到了,大家开开心心的欣赏这部全球大作《变形金刚》……

5.2> 过程分析

到达这个阶段,类就可以顺利加载到系统中。此时,类才会开始执行Java字节码

初始化阶段是执行类构造器<client>方法的过程。<client>方法是由编译器自动收集类中的类变量的赋值操作静态语句块中的语句合并而成的。虚拟机会保证子<client>方法执行之前,父类的<client>方法已经执行完毕,如果一个类中没有对静态变量赋值也没有静态语句块,那么编译器可以不为这个类生成<client>()方法

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

这篇关于看个电影就能学会类的加载过程?我不信!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/341753

相关文章

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

linux部署NFS和autofs自动挂载实现过程

《linux部署NFS和autofs自动挂载实现过程》文章介绍了NFS(网络文件系统)和Autofs的原理与配置,NFS通过RPC实现跨系统文件共享,需配置/etc/exports和nfs.conf,... 目录(一)NFS1. 什么是NFS2.NFS守护进程3.RPC服务4. 原理5. 部署5.1安装NF

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二