当前位置: 首页 > 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反…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...