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

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^)/ ~ 「干货分享,每天更新」

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

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

相关文章

数字孪生引领智慧港口新纪元

随着数字化时代的到来&#xff0c;港口行业也在不断寻求创新&#xff0c;以提高运营效率、优化资源分配&#xff0c;并实现可持续发展。数字孪生技术作为一种强大的虚拟仿真工具&#xff0c;正日益成为智慧港口解决方案的核心。本文带大家一起探讨数字孪生在智慧港口领域的应用…

智慧政务,长远布局——AIGC引领,加速推进数字化政府建设

在人工智能、虚拟现实等领域迅猛发展且日益成熟的背景下&#xff0c;AI行业正迈向蓬勃发展的全新阶段&#xff0c;市场规模持续扩张。与此同时&#xff0c;数字服务也正在蓬勃兴起&#xff0c;新一代信息技术为数字政府构建了坚实支撑&#xff0c;重塑了政务信息化管理、业务架…

SQL 大小敏感问题

在SQL中&#xff0c;关键字和函数名 是不区分 大小写的 比如&#xff08;select、where、order by 、group by update 等关键字&#xff09;&#xff0c;以及函数(ABS、MOD、round、min等) window系统默认是大小写不敏感 &#xff08;ZEN文件和zen 文件 不能同时存在&#xff…

方案:AI边缘计算智慧工地解决方案

一、方案背景 在工程项目管理中&#xff0c;工程施工现场涉及面广&#xff0c;多种元素交叉&#xff0c;状况较为复杂&#xff0c;如人员出入、机械运行、物料运输等。特别是传统的现场管理模式依赖于管理人员的现场巡查。当发现安全风险时&#xff0c;需要提前报告&#xff0…

自己搭建Minecraft服务器并通过cpolar内网穿透实现与公网小伙伴联机我的世界

文章目录 1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址 9. 使用固定公网地址远程联机 …

tomcat更改端口号和隐藏端口号

因为默认端口:8080不会自动隐藏&#xff0c;因此为了更显格调需要将其改为:80 进入tomcat的server文件 将其改为80&#xff0c;之后将tomcat重新启动即可 tomcat启动流程 [rootshang ~]# cd /usr/local/tomcat/apache-tomcat-8.5.92 [rootshang apache-tomcat-8.5.92]# cd b…

【Unity学习笔记】DOTween(2)官方案例

本文中大部分内容学习来自DOTween官方文档 此处无法展示动图&#xff08;懒得录GIF&#xff09;&#xff0c;请下载官方案例场景自行学习 文章目录 场景1 基本补间场景2 动态补间场景3 Shader修改场景4 路径拟合运动场景5 序列播放场景6 UGUI 场景1 基本补间 案例一展示了最基…

Orchestrator自身高可用性方案

目录 获得 HA 的方法 一 没有高可用性 &#xff08;No high availability&#xff09; 使用场景 架构组成 架构图 二 半高可用性&#xff08;Semi HA&#xff09; 三 基于共享数据库后端高可用&#xff08;HA via shared backend&#xff09; 四 基于Raft协议高可用 五…

服务器数据恢复-AIX PV完整镜像方法以及误删LV的数据恢复方案

AIX中的PV相当于物理磁盘&#xff08;针对于存储来说&#xff0c;PV相当于存储映射过来的卷&#xff1b;针对操作系统来说&#xff0c;PV相当于物理硬盘&#xff09;&#xff0c;若干个PV组成一个VG&#xff0c;AIX可以将容量不同的存储空间组合起来统一分配。AIX把同一个VG的所…

java maven项目打jar包发布(精简版)

目录 一、maven打包 二、安装jdk环境 三、安装mysql 四、jar包传输到服务器 一、maven打包 先clean再package target文件夹下面有生成一个jar包 二、安装jdk环境 1、下载jdk cd /usr/local wget https://repo.huaweicloud.com/java/jdk/8u201-b09/jdk-8u201-linux-x64.tar.…

Unity - 制作package 插件包

1.将制作的插件包代码放置一个根目录下 2.在跟目录下创建package.json文件 //package.json {"name": "com.unity.customlibrary", //插件包名:com.组织名.包名"displayName": "CustomLibrary", //显示的插件名"v…

基于深度学习的图像风格迁移发展总结

前言 本文总结深度学习领域的图像风格迁移发展脉络。重点关注随着GAN、CUT、StyleGAN、CLIP、Diffusion Model 这些网络出现以来&#xff0c;图像风格迁移在其上的发展。本文注重这些网络对图像风格迁移任务的影响&#xff0c;以及背后的关键技术和研究&#xff0c;并总结出一…

stm32的位带操作

在51单片机中&#xff0c;我们可以使用P2^1来对单片机的某一位进行操作&#xff0c;到了stm32&#xff0c;我们通过位带操作&#xff0c;将寄存器的每一位映射到一个32位的地址。如下是我查资料摘录的一些图片。 映射方式 SRAM: AliasAddr 0x22000000 (A-0X20000000)*8*4n*4…

C++类成员的访问权限以及类的封装

C通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限&#xff0c;它们分别表示公有的、受保护的、私有的&#xff0c;被称为成员访问限定符。所谓访问权限&#xff0c;就是你能不能使用该类中的成员。 Java、C# 程序员注意&#xff0c;C 中的 publ…

IDEA项目实践——VUE介绍与案例分析

系列文章目录 IDEA项目实践——JavaWeb简介以及Servlet编程实战 IDEA项目实践——Spring集成mybatis、spring当中的事务 IDEA项目实践——Spring当中的切面AOP IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——Spring框架简介&#xff0c;以及IOC注解 I…

YOLO目标检测——动漫头像数据集下载分享

动漫头像数据集是用于研究和分析动漫头像相关问题的数据集&#xff0c;它包含了大量的动漫风格的头像图像。动漫头像是指以动漫风格绘制的虚构人物的头像图像&#xff0c;常见于动画、漫画、游戏等媒体。 数据集点击下载&#xff1a;YOLO动漫头像数据集50800图片.rar

Matlab分割彩色图像

彩色图像 彩色图像除有亮度信息外&#xff0c;还包含有颜色信息。以最常见的RGB&#xff08;红绿蓝&#xff09;彩色空间为例来简要说明彩色图像&#xff1a; 彩色图像可按照颜色的数目来划分。例如&#xff0c;256色图像和真彩色图像&#xff08;2的16次方&#xff1d;21677…

Android 12 源码分析 —— 应用层 二(SystemUI大体组织和启动过程)

Android 12 源码分析 —— 应用层 二&#xff08;SystemUI大体组织和启动过程&#xff09; 在前一篇文章中&#xff0c;我们介绍了SystemUI怎么使用IDE进行编辑和调试。这是分析SystemUI的最基础&#xff0c;希望读者能尽量掌握。 本篇文章&#xff0c;将会介绍SystemUI的大概…

若依微服务版部署到IDEA

1.进入若依官网&#xff0c;找到我们要下的微服务版框架 2.点击进入gitee,获取源码&#xff0c;下载到本地 3.下载到本地后&#xff0c;用Idea打开&#xff0c;点击若依官网&#xff0c;找到在线文档&#xff0c;找到微服务版本的&#xff0c;当然你不看文档&#xff0c;直接按…

Java集合案例:斗地主游戏开发

斗地主游戏的开发业务需求分析业务&#xff1a;共有54张牌点数&#xff1a;“3”,“4”,“5”,“6”,“7”,“8”,“9”,“10”,“J”,“Q”,“K”,“A”,“2”花色&#xff1a;“♠”,“❤”,“♣”,“♦”大小王&#xff1a;“&#x1f472;”,“&#x1f0cf;” *点数分别要…