当前位置: 首页 > news >正文

JVM——类的生命周期(加载阶段,连接阶段,初始化阶段)

目录

  • 1.加载阶段
  • 2.连接阶段
    • 1.验证
    • 2.准备
    • 3.解析
  • 3.初始化阶段
  • 4.总结

在这里插入图片描述
类的生命周期
在这里插入图片描述

1.加载阶段

⚫ 1、加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。
程序员可以使用Java代码拓展的不同的渠道。
⚫ 2、类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到方法区中。
⚫ 3、类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到内存的方法区中。
生成一个InstanceKlass对象,保存类的所有信息,里边还包含实现特定功能比如多态的信息。
在这里插入图片描述
⚫ 4、同时,Java虚拟机还会在堆中生成一份与方法区中数据类似的java.lang.Class对象。
作用是在Java代码中去获取类的信息以及存储静态字段的数据(JDK8及之后存放在堆区中)。在JDK8以前是静态字段存放在方法区中
主要作用:在实现反射的时候需要先拿到类的基本的信息(class对象)通过其获取其内的方法和字段,进行一系列的操作。
在这里插入图片描述
⚫ 对于开发者来说,只需要访问堆中的Class对象而不需要访问方法区中所有信息。
这样Java虚拟机就能很好地控制开发者访问数据的范围。

  1. instanceKlass是使用C++语言编写的对象,Java语言不能直接去操作这个对象,
  2. Java.lang.Class类中包含的字段要少于instanceKlass中的,instanceKlass中的许多字段是开发者用不到的,为了保护这些数据,Java.lang.Class类中只包含开发者需要用到的方法等字段。

在这里插入图片描述

2.连接阶段

在这里插入图片描述

1.验证

⚫ 连接(Linking)阶段的第一个环节是验证,验证的主要目的是检测Java字节码文件是否遵守了《Java虚拟机规
范》中的约束。这个阶段一般不需要程序员参与。
⚫ 主要包含如下四部分,具体详见《Java虚拟机规范》:

  1. 文件格式验证,比如文件是否以0xCAFEBABE开头,主次版本号是否满足当前Java虚拟机版本要求。
  2. 元信息验证,例如类必须有父类(super不能为空)。
  3. 验证程序执行指令的语义,比如方法内的指令执行到一半强行跳转到其他方法中去。
  4. 符号引用验证,例如是否访问了其他类中private的方法等

2.准备

⚫ 准备阶段为静态变量(static)分配内存并设置初始值。
⚫ 注意:涉及到的内存结构只讨论JDK8及之后的版本
在这里插入图片描述

⚫ 准备阶段只会给静态变量赋初始值,而每一种基本数据类型和引用数据类型都有其初始值。
注: final修饰的基本数据类型的静态变量,准备阶段直接会将代码中的值进行赋值在这里插入图片描述

3.解析

⚫ 解析阶段主要是将常量池中的符号引用替换为直接引用。
⚫ 符号引用就是在字节码文件中使用编号来访问常量池中的内容在这里插入图片描述
⚫ 直接引用不在使用编号,而是使用内存中地址进行访问具体的数据。在这里插入图片描述

3.初始化阶段

⚫ 初始化阶段会执行静态代码块中的代码,并为静态变量赋值。
⚫ 初始化阶段会执行字节码文件中clinit部分的字节码指令。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
⚫ 以下几种方式会导致类的初始化:
1.访问一个类的静态变量或者静态方法,注意变量是final修饰的并且等号右边是常量不会触发初始化。
2.调用Class.forName(String className)。
3.new一个该类的对象时。
4.执行Main方法的当前类。
在这里插入图片描述
在这里插入图片描述
⚫ clinit指令在特定情况下不会出现,比如:如下几种情况是不会进行初始化指令执行的。
1.无静态代码块且无静态变量赋值语句。
2.有静态变量的声明,但是没有赋值语句。
3.静态变量的定义使用final关键字,这类变量会在准备阶段直接进行初始化。在这里插入图片描述
⚫ 直接访问父类的静态变量,不会触发子类的初始化。
⚫ 子类的初始化clinit调用之前,会先调用父类的clinit初始化方法。
在这里插入图片描述
在这里插入图片描述
数组的创建不会导致数组中元素的类进行初始化。
在这里插入图片描述
final修饰的变量如果赋值的内容需要执行指令才能得出结果,会执行clinit方法进行初始化。
在这里插入图片描述

4.总结

在这里插入图片描述
在这里插入图片描述
几个要点:
1.静态变量的定义使用final关键字,这类变量会在准备阶段直接进行初始化
(除非要执行方法)。
2.直接访问父类的静态变量,不会触发子类的初始化。子类的初始化cinit调用之前,
会先调用父类的cinit初始化方法。
在这里插入图片描述

相关文章:

JVM——类的生命周期(加载阶段,连接阶段,初始化阶段)

目录 1.加载阶段2.连接阶段1.验证2.准备3.解析 3.初始化阶段4.总结 类的生命周期 1.加载阶段 ⚫ 1、加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。 程序员可以使用Java代码拓展的不同的渠道。 ⚫ 2、类加载器在加载完类…...

CSS中实现元素居中的几种方法总结

一、使用 text-align: center 居中 使用 text-align: center; 可以在CSS中实现内联元素的水平居中。这个技术利用了CSS的 text-align 属性&#xff0c;通过对元素的文本对齐方式进行调整来实现居中效果。注&#xff1a;只展示主要代码。 <div class"container"&…...

保护听力戴什么耳机比较好?开放式耳机能保护听力吗?

如果想要在保护听力的前提下戴耳机&#xff0c;那么我是推荐戴骨传导耳机的&#xff01;&#xff01;&#xff01; 所谓骨传导即是一种声音传递的方式&#xff0c;跟普通耳机不同的是传统耳机是通过空气将声音通过耳膜以此完成传递&#xff0c;而骨传导耳机的原理是将声音以不同…...

【JVM】垃圾回收机制

【JVM】垃圾回收机制 文章目录 【JVM】垃圾回收机制1. 方法区的回收2. 堆的回收2.1 引用计数法2.2 可达性分析算法 3. 对象引用3.1 强引用3.2 软引用3.3 弱引用3.4 虚引用和终结器引用 4. 垃圾回收算法4.1 标记清除算法4.2 复制算法4.3 标记整理算法4.4 分代垃圾回收算法 5. 垃…...

MySQL数据库入门到精通——运维篇(2)

MySQL数据库入门到精通——运维篇&#xff08;2&#xff09; 1. 分库分表1.1 分库分表介绍1.1.1 现在的问题1.1.2 拆分策略1.1.2.1 垂直拆分策略1.1.2.2 水平拆分策略 1.2 Mycat概述1.3 Mycat入门1.4 Mycat配置1.4.1 Schema标签1.4.2 Datanode标签1.4.3 Datahost标签1.4.4 rule…...

投资者如何保障个人利益?行业律师与欧科云链专家给出建议

香港作为全球加速拥抱Web3变革的引领之地&#xff0c;规定自今年6月起在香港经营虚拟资产服务业务需申领牌照。蜂拥而至的Web3创业公司&#xff0c;伺机而动的加密货币交易所&#xff0c;以及跃跃欲试的行业从业者&#xff0c;都让这座金融之都热闹非凡。但近期伴随JPEX诈骗案等…...

【办公软件】C#调用NPOI实现Excel文件的加载、导出功能

文章目录 1. 引言2. 环境准备3. 示例代码4. 结果5. 总结 1. 引言 本文将介绍如何使用C#和NPOI库实现Excel文件的读写操作&#xff0c;并通过加载文件和导出文件的按钮进行封装。NPOI是一个强大的.NET库&#xff0c;可以轻松处理Excel文件。我们将学习如何使用NPOI打开现有的Ex…...

UVA 11990 “Dynamic‘‘ Inversion 区域树 + 树状数组

一、题目大意 我们有 1 2 3 ... n 这些数字组成的一个排列数组 a &#xff0c;需要从这个排列中取出m个数字&#xff0c;要求计算出出每次取出数字之前&#xff0c;数组中的逆序数&#xff08;逆序数就是 i < j&#xff0c;但是 ai > aj的数&#xff09; 二、解题思路 …...

邮件钓鱼分析

三大协议 SPF Sender Policy Framework 的缩写&#xff0c;一种以IP地址认证电子邮件发件人身份的技术。 注&#xff1a;收信人怀疑币是假的&#xff0c;查看这个送信包裹里面记录的发出地是不是央行&#xff0c;如果是黑市有可能是黑钱 DKIM 加密签名和域名关联。 注&am…...

Android 小技巧

1. Android Studio下载地址 Android 开发者 | Android Developers (google.cn) 2.Android Aosp 在线查看地址&#xff1a; AOSPXRef 3.Android 官方文档地址&#xff1a; Android 开源项目 | Android Open Source Project (google.cn)...

Centos MySQL --skip-grant-tables详解

跳过权限验证&#xff0c;导出数据备份 主机系统&#xff1a;Centos7 64位 数据库版本&#xff1a;MySQL5.7.40 使用–skip-grant-tables场景 1、忘记管理员密码 2、修改管理员密码 mysql -uroot -p显示错误内容如下&#xff1a; ERROR 1045 (28000): Access denied for …...

Linux:进程控制的概念和理解

文章目录 进程的创建fork函数写时拷贝的原理fork函数的用法和失败原因 进程终止进程的退出进程异常的问题 进程终止进程退出 进程等待什么是进程等待&#xff1f;为什么要进行进程等待&#xff1f;如何进行进程等待&#xff1f;父进程如何知道子进程的退出信息&#xff1f; wai…...

ubuntu20.04编译安装nginx

目录 一.更新系统软件包列表二.安装编译Nginx所需的依赖三.下载Nginx源代码四.解压源代码文件五.进入解压后的Nginx目录六.配置编译选项七.编译并安装Nginx八.启动Nginx服务九.验证Nginx是否正常运行十.Nginx命令十一.配置软链接 在Ubuntu 20.04上编译安装Nginx&#xff0c;你可…...

操作系统的分页

操作系统的分页功能与内存管理密切相关。为了更好地理解这一点&#xff0c;我们先简要概述分页的基本概念&#xff0c;然后解释其与页面调度和存储效率的关系。 分页的基本概念 分页是操作系统中的一种内存管理策略。物理内存被划分为固定大小的块&#xff0c;称为“页面”或“…...

微服务环境搭建

JDK安装&#xff1a;https://blog.csdn.net/JHYPXS/article/details/134155680 mysql安装&#xff1a;https://blog.csdn.net/JHYPXS/article/details/102566304 nacos安装&#xff1a;https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html...

ffmpeg 截取命令

从00:00:03.500开始截取往后长度到结尾的mp3音频&#xff08;这个更有用&#xff0c;测试好用&#xff09; ffmpeg -i d:/c.mp3 -ss 00:00:03.500 d:/output.mp3 将两个音频合并成一个音频&#xff08;测试好用&#xff09; ffmpeg -i "concat:d:/c.mp3|d:/output.mp3&…...

TypeScript深度剖析:TypeScript 中枚举类型应用场景?

文章目录 一、是什么二、使用数字枚举字符串枚举异构枚举本质 三、应用场景 一、是什么 枚举是一个被命名的整型常数的集合&#xff0c;用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型 通俗来说&#xff0c;枚举就是一个对象的所有可能取值的集…...

[推荐]SpringBoot,邮件发送附件含Excel文件(含源码)。

在阅读本文前&#xff0c;可以先阅读我的上一篇文章&#xff1a; SpringBoot&#xff0c;使用JavaMailSender发送邮件(含源码)。 &#xff0c;本文使用的代码案例涉及到的 jar包、application.properties配置与它相同。 先看一下效果。 图一 图二 在下方代码案例中&#xff0c;…...

node学习之包管理器

一、概念介绍 **1.1 包是什么 ** 『包』英文单词是 package &#xff0c;代表了一组特定功能的源码集合 **1.2 包管理工具 ** 管理『包』的应用软件&#xff0c;可以对「包」进行 下载安装 &#xff0c; 更新 &#xff0c; 删除 &#xff0c; 上传 等操作 借助包管理工具&…...

自动驾驶车辆轨迹跟踪

相对于传统的模型预测控制&#xff08;MPC&#xff09;&#xff0c;简化的车辆模型通常会导致预测结果不准确&#xff0c;这对车辆的转弯等行为具有负面影响。因此作者提出了一种轨迹规划和跟踪框架&#xff1a; 该框架应用人工势场来获得目标轨迹&#xff1b;并利用具有PID反…...

UE4动画师救星:用Control Rig快速修复动捕数据的5个实战技巧与避坑指南

UE4动画师救星&#xff1a;用Control Rig快速修复动捕数据的5个实战技巧与避坑指南 在动作捕捉技术日益普及的今天&#xff0c;动画师们常常面临一个尴尬的现实&#xff1a;昂贵的动捕设备能捕捉到演员生动的表演&#xff0c;但原始数据往往充斥着各种瑕疵——手部穿模、脚步滑…...

I2C设备扫描器:嵌入式系统总线拓扑发现与地址诊断工具

1. I2C设备扫描器&#xff1a;嵌入式系统中总线拓扑发现的核心工具IC&#xff08;Inter-Integrated Circuit&#xff09;总线因其仅需两根信号线&#xff08;SCL时钟线与SDA数据线&#xff09;、支持多主多从架构、内置仲裁与应答机制等特性&#xff0c;成为嵌入式系统中传感器…...

基于双向反激变换器的SOC估算与主动均衡策略仿真研究——复现硕士论文并拓展六节电池模型与均衡策略分析

基于双向反激变换器的SOC估算与主动均衡仿真 可以 [1]复现硕士论文&#xff1a;《锂离子电池SOC估算与主动均衡策略研究_王昊》 [2]六节电池模型&#xff1a;使用Simmulink搭建了六节电池主动均衡仿真 [3]均衡策略&#xff1a;选择了电压、SOC及其分阶段使用作为主动均衡变量&a…...

PostgreSQL 二进制安装全流程详解

1. 为什么选择二进制安装PostgreSQL 第一次接触PostgreSQL时&#xff0c;我也纠结过到底该用哪种安装方式。源码编译、包管理器、二进制安装各有优劣&#xff0c;但实测下来&#xff0c;二进制安装是最适合新手的方案。它既不像源码编译那样需要处理复杂的依赖关系&#xff0c;…...

PINN 融合机器学习重构科学计算范式,物理先验赋能神经网络高效求解偏微分方程

PINN 即物理信息神经网络&#xff0c;将物理定律&#xff08;如偏微分方程、边界条件&#xff09;以约束损失形式嵌入机器学习框架&#xff0c;实现数据驱动与物理先验的融合。它依托神经网络的拟合能力&#xff0c;在训练中同时最小化观测数据误差与物理方程残差&#xff0c;无…...

如何通过arknights-ui实现明日方舟界面定制?解锁个性化游戏体验新方式

如何通过arknights-ui实现明日方舟界面定制&#xff1f;解锁个性化游戏体验新方式 【免费下载链接】arknights-ui H5 复刻版明日方舟游戏主界面 项目地址: https://gitcode.com/gh_mirrors/ar/arknights-ui arknights-ui是一个基于H5CSS技术的开源项目&#xff0c;它提供…...

终极宝可梦随机化指南:Universal Pokemon Randomizer ZX 完全使用教程

终极宝可梦随机化指南&#xff1a;Universal Pokemon Randomizer ZX 完全使用教程 【免费下载链接】universal-pokemon-randomizer-zx Public repository of source code for the Universal Pokemon Randomizer ZX 项目地址: https://gitcode.com/gh_mirrors/un/universal-po…...

5分钟搞懂阻抗匹配:从L型网络到Smith圆图实战指南(附ADS仿真步骤)

5分钟搞懂阻抗匹配&#xff1a;从L型网络到Smith圆图实战指南&#xff08;附ADS仿真步骤&#xff09; 引言&#xff1a;为什么阻抗匹配如此重要&#xff1f; 想象一下&#xff0c;你正在调试一块射频电路板&#xff0c;信号强度总是达不到预期。用频谱仪观察波形时&#xff0c;…...

FUXA SVG编辑器元素管理功能优化:从问题发现到价值验证

FUXA SVG编辑器元素管理功能优化&#xff1a;从问题发现到价值验证 【免费下载链接】FUXA Web-based Process Visualization (SCADA/HMI/Dashboard) software 项目地址: https://gitcode.com/gh_mirrors/fu/FUXA FUXA作为一款开源的Web-based工业自动化HMI/SCADA系统&am…...

AI辅助开发新思路:告诉快马你的需求,自动生成图形化MobaXterm工具

今天想和大家分享一个用AI辅助开发的小技巧——如何快速生成一个图形化的MobaXterm工具。作为一个经常需要管理远程服务器的开发者&#xff0c;我一直在寻找更高效的工作方式。最近在InsCode(快马)平台上尝试了AI辅助开发&#xff0c;发现它真的能大幅提升开发效率。 需求分析 …...