Java类的生命周期-连接阶段

news/2024/9/29 22:07:29 标签: java, jvm

Java类的生命周期-连接阶段


上篇讲述了类的加载阶段,通过类加载器读取字节码文件后在方法区与堆区生成对应的存放类信息的对象,本篇将讲解他的下一阶段-连接阶段

上篇说到类加载的五大阶段:

加载
连接
初始化
使用
卸载

连接阶段又可以分为三个子阶段:验证-准备-解析 ,我们逐一讲解

连接
验证
准备
解析

1.验证

验证阶段的主要目的是检测java字节码文件是否遵守了《Java虚拟机规范》,此过程一般不需要开发者参与
主要有:

  • 文件格式验证,文件开头是否为0XCAFEBABE,主次版本号是否满足当前Java虚拟机版本要求
  • 元信息验证,例如类必须要有父类
  • 验证程序执行指令的语义
  • 符号引用验证,是否访问了其他类中的private字段

以主次版本号的验证为例子,观察JDK8虚拟机的源码,其判断逻辑规则如下:

java">return (major >= JAVA_MAIN_SUPPORTED_VERSION) &&
	   (major <= max_version) &&
	   ((major != max_version) ||
	   (minor <= JAVA_MAIN_SUPPORTED_MINOR_VERSION));

major是主版本号,minor是副版本号,JAVA_MAIN_SUPPORTED_VERSION是最低支持的版本号,为45,即JDK1.0,max_version是最高版本号,即当前环境JDK版本号,如JDK8的52,所以字节码文件的主版本号要在45与当前版本号之间,JAVA_MAIN_SUPPORTED_MINOR_VERSION是支持最高副版本号,JDK未使用为0,所以当主版本号等于max_version时,副版本号不能大于0


2.准备

准备阶段是为静态字段分配内存并设置初始值
设置初始值并不是直接将其设置为代码中赋予的值,例如:

java">public class Demo{
	public static int i = 2;
}

在准备阶段呢,会为其开辟一份空间,并为其设置初始值为0,并不是2,而0就是默认值,赋值为2的操作会在下一阶段-初始化阶段执行,而每一种类型的静态字段都会在准备阶段赋予一个默认值:

数据类型初始值
int0
long0L
short0
char‘\u0000’
byte0
booleanfalse
double0.0
引用数据类型null

其目的是为了防止若代码中并未对其赋值,其内存中可能是之前残留的任意值

但是

如果静态字段的由final进行修饰,如:

java">public class Demo{
	public static final int i = 2;
}

在准备阶段就会赋值为2,final修饰的基本数据类型会在准备阶段就为其赋值为代码中的值


3.解析

解析阶段就较为简单,就是将常量池中的符号引用替换为直接引用即内存地址引用
在字节码文件中对于常量池中的引用是符号引用,通过符号即可找到其引用的值,但是运行时这种寻找索引符号的方法速度非常慢
符号引用
于是在解析阶段就会把符号索引全部替换为直接地址索引,直接通过地址就可以找到类的具体信息
直接引用


这就是连接阶段的所有过程,看到这里如果对你有帮助请点一个关注,下一篇更新初始化阶段


http://www.niftyadmin.cn/n/5683803.html

相关文章

python股票因子,交易所服务器宕机,量化交易程序怎么应对

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…

Llama 3.2来了,多模态且开源!AR眼镜黄仁勋首批体验,Quest 3S头显价格低到离谱

如果说 OpenAI 的 ChatGPT 拉开了「百模大战」的序幕&#xff0c;那 Meta 的 Ray-Ban Meta 智能眼镜无疑是触发「百镜大战」的导火索。自去年 9 月在 Meta Connect 2023 开发者大会上首次亮相&#xff0c;短短数月&#xff0c;Ray-Ban Meta 就突破百万销量&#xff0c;不仅让马…

滚雪球学MySQL[1.1讲]:MySQL简介与环境配置

全文目录&#xff1a; 前言1. MySQL简介与环境配置1.1 MySQL简介什么是MySQLMySQL的历史和版本MySQL的应用场景 1.2 安装与配置安装MySQL&#xff08;Windows、Linux、macOS&#xff09;配置文件解析&#xff08;my.cnf&#xff09;启动与停止MySQL服务 1.3 MySQL客户端工具MyS…

Android 10.0 Launcher3禁止改变density等系统密度导致布局变化hotseat靠右边显示功能实现

1.前言 在10.0的系统rom定制化开发中,在进行launcher3的定制化功能中,在有些项目修改系统密度density的值, 以后导致launcher3的布局变乱,hotseat布局成一行竖屏显示看的很不美观,接下来就看如何分析解析 禁止density改变导致布局变动的功能分析 2.Launcher3禁止改变den…

活体检测标签之2.4G有源RFID--SI24R2F+

首先从客户对食品安全和可追溯性的关注切入&#xff0c;引出活体标签这个解决方案。接着分别阐述活体标签在动物养殖和植物产品方面的应用&#xff0c;强调其像 “身份证” 一样记录重要信息&#xff0c;让客户能够了解食品的来源和成长历程&#xff0c;从而放心食用。最后呼吁…

如何伪装服务器地址?

在现代网络环境中&#xff0c;出于隐私、安全或绕过限制的目的&#xff0c;伪装服务器地址成为一种重要的技术手段。伪装服务器地址的目的主要是隐藏服务器的真实IP&#xff0c;以防止恶意攻击、数据追踪或规避某些网络限制。在没有提到VPN的前提下&#xff0c;仍然有多种方法可…

【高频SQL基础50题】11-15

迷迷糊糊&#xff0c;debug又一天。 目录 1.查询近30天活跃用户数 2.员工的直属部门 3.换座位 4.患某种疾病的患者 5.大的国家 1.查询近30天活跃用户数 排序和分组题。 # Write your MySQL query statement below SELECT activity_date AS day,count(DISTINCT user_id…

springboot 工程 读取自定义的xml文件

在Spring Boot工程中读取自定义的XML文件&#xff0c;你可以通过几种不同的方式来实现。以下是一些常见的方法&#xff1a; 使用Resource和XmlBeanDefinitionReader&#xff08;如果你需要加载Spring的XML配置文件&#xff09; 虽然这通常用于加载Spring的上下文配置文件&…