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

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

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

相关文章
|
6天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
15天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
10天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
618 217
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
859 61
|
8天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1310 157
|
5天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
246 138
|
7天前
|
存储 安全 固态存储
四款WIN PE工具,都可以实现U盘安装教程
Windows PE是基于NT内核的轻量系统,用于系统安装、分区管理及故障修复。本文推荐多款PE制作工具,支持U盘启动,兼容UEFI/Legacy模式,具备备份还原、驱动识别等功能,操作简便,适合新旧电脑维护使用。
543 109