【JVM】类的生命周期

news2024/9/29 5:28:04

【JVM】类的生命周期

文章目录

  • 【JVM】类的生命周期
    • 1. 生命周期概述
    • 2. 加载阶段
    • 3. 连接阶段
      • 3.1 验证
      • 3.2 准备
      • 3.3 解析
    • 4. 初始化阶段
      • 4.1 触发初始化的方式
      • 4.2 clinit不存在的情况
      • 4.3 多个类的初始化
    • 5. 总结

1. 生命周期概述

类的生命周期分为5/7个阶段:

  1. 加载(Loading)
  2. 连接(Linking)
    • 验证
    • 准备
    • 解析
  3. 初始化(Initialization)
  4. 使用(Using)
  5. 卸载(Unloading)

2. 加载阶段

  1. 加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。
  2. 类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到方法区中。
  3. 生成一个InstanceKlass对象,保存类的所有信息,里边还包括实现特定功能比如多态的信息。
image-20231024230054185
  1. 同时,Java虚拟机还会在堆中生成一份与方法区中数据类似的java.lang.Class对象。作用是在Java代码中去获取类的信息以及存储静态字段的数据(jdk8及之后)
image-20231024230311011

对于开发者来说,只需要访问堆中的Class对象而不需要访问方法区中所有信息。这样Java虚拟机就能很好地控制开发者访问数据的范围。

image-20231024230504548


3. 连接阶段

连接阶段可以分为三个小阶段:

  1. 验证:验证内容是否满足《Java虚拟机规范》
  2. 准备:给静态变量赋初值
  3. 解析:将常量池中的符号引用替换成指向内存的直接引用

3.1 验证

连接(Linking)阶段的第一个环节就是验证。验证的主要目的是检测Java字节码文件是否遵守了《Java虚拟机规范》中的约束

主要包括4个部分(具体详见 《Java虚拟机规范》):

  1. 文件格式验证:比如检测字节码文件是否以 CAFEBABE 开头,主次版本号是否满足当前Java虚拟机版本要求。

  2. 元信息验证:比如类必须有父类(super不能为空)。

    image-20231024232536154

  3. 验证程序执行指令的语义:比如方法内的指令执行中跳转到不正确的位置。

  4. 符号引用验证:比如是否访问了其他类中private的方法等。


3.2 准备

准备阶段为静态变量分配内存并设置初始值,每一种基本数据类型和引用数据类型都有其初始值。

image-20231024232844953

final 关键字修饰的基本数据类型的静态变量,在准备阶段直接会将代码中的值进行赋值。

image-20231024233113290


3.3 解析

解析阶段主要是将常量池中的符号引用替换为直接引用。符号引用就是在字节码文件中使用编号来访问常量池中的内容。

image-20231024233742347 image-20231024233754472

4. 初始化阶段

  • 初始化阶段会执行静态代码块中的代码,并为静态变量赋值。
  • 初始化阶段会执行字节码文件中 clinit 部分的字节码指令。
image-20231024235051409 image-20231024235108640 image-20231024235213775

我们发现,将静态代码块和静态变量的相对位置发生变化时,字节码指令的位置也会发生变化。也就是说clinit方法中的执行顺序与Java中编写的顺序是一致的。


4.1 触发初始化的方式

以下有几种方式会导致类的初始化:

  1. 访问一个类的静态变量或者静态方法。注意变量是final修饰的并且等号右边是常量则不会触发初始化

    public static final value = 1;//不会触发初始化,因为在连接(准备)阶段就已经赋值了。
    
  2. 调用 Class.forName(String className)

  3. new一个该类的对象。

  4. 执行main方法的当前类。

注:添加 -XX:+TraceClassLoading 参数可以打印出加载并初始化的类。


4.2 clinit不存在的情况

clinit指令在特定情况下不会出现:

  1. 无静态代码块且无静态变量赋值语句。
  2. 有静态变量的声明,但是没有赋值语句。
  3. 静态变量的定义使用 final 关键字,这类变量会在准备阶段直接进行初始化。

4.3 多个类的初始化

  • 直接访问父类的静态变量,不会触发子类的初始化。
  • 子类的初始化 clinit 调用之前,会先调用父类的 clinit 初始化方法。
image-20231025001252181 image-20231025001305872

5. 总结

类的生命周期分为5个阶段:

  1. 加载:根据类的全限定名把字节码文件的内容加载并转换成合适的数据放入内存种种那个,存放在方法区和堆上。
  2. 连接
    • 验证:魔数,版本号等验证,一般不需要程序员关注。
    • 准备:为静态变量分配内存并设置初始值。
    • 解析:将常量池中的符号引用(编号)替换为直接引用(内存地址)
  3. 初始化:执行静态代码块和静态变量的赋值。
  4. 使用
  5. 卸载

注意要点:

  1. 静态变量使用 final 关键字修饰时,赋值操作在准备阶段就完成了。
  2. 直接访问父类的静态变量不会触发子类的初始化。
  3. 在子类的初始化 clinit 调用之前会先调用父类的 clinit 初始化方法。
  4. 添加 -XX:+TraceClassLoading 参数可以在控制台打印出加载并初始化的类

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MSQL系列(八) Mysql实战-SQL存储引擎

Mysql实战-SQL存储引擎 前面我们讲解了索引的存储结构,BTree的索引结构,我们一般都知道Mysql的存储引擎有两种,MyISAM和InnoDB,今天我们来详细讲解下Mysql的存储引擎 文章目录 Mysql实战-SQL存储引擎1.存储引擎2.MyISAM的特点3. InnoDB的特…

面向小白vim使用手册

撤回上一步 按 "u" 注释多段 1:选择开始注释的地方,在命令模式下按 ctrv进入可视化模式。 2:鼠标向下滑动,选中要注释的段落:3:进入大写锁定,按"i"键进入插入模式: 4:输…

vue3 + ant design vue项目svg格式的background-image使用配置

直接使用的时候会报错: 图片解析不出来还是svg源文件代码 项目启动报错 vue3使用的时候普通配置会出现this.getOptions is not function错误( Webpack 版本升级引起的,在较新的 Webpack 版本中,this.getOptions 方法已被移除。)…

小知识(6) el-table表格选中行和回显行(vue3)

el-table表格选中行和回显行 官方文档说明 https://element-plus.org/zh-CN/component/table.html#table-%E6%96%B9%E6%B3%95 环境&#xff1a;vue3element-plus 选中行selection <el-table ref"baseTableRef" row-key"id" border :selection"tr…

支持多校 微信课表小程序源码 排课小程序源码 支持导入课表 情侣课表 背景设置

练手Lab课程表小程序源码是一个基于thinkphp系统进行开发的前后端分离系统。 源码功能介绍 1、情侣功能 2、情侣间留言 3、情侣间互相设置课程表背景 4、自己日、周课程表背景设置 5、教务系统课程表导入 6、导入别人分享的课表 7、导入别人分享的单课 8、多校支持 9…

25装饰器2

有一个比较绕的地方&#xff0c;但是我相信我能理解透彻这个里面的逻辑还有原理 def check(func):print(登录验证)def inner():func()return innerdef fss():print(发说说)fss check(fss) fss()这里的fss check(fss)还有后面的fss()什么意思&#xff1f;怎么理解呢&#xff…

Qt之彻底解决QSpinBox限定范围无效的问题

QSpinBox有个比较啃爹的问题,不管取值范围设置为多少,都能一直输入0,如下图所示: 当取值范围包含负数时,负号后也可以一直输入0,如下图所示: 还有就是当取值范围设置为10以上时,比如10~100,却可以输入1~9 虽然上述非法输入最终都未生效,当QSpinBox失去焦点时会显示为…

【iOS逆向与安全】某音App直播间自动发666 和 懒人自动看视频

1.目标 由于看直播的时候主播叫我发 666&#xff0c;支持他&#xff0c;我肯定支持他呀&#xff0c;就一直发&#xff0c;可是后来发现太浪费时间了&#xff0c;能不能做一个直播间自动发 666 呢&#xff1f;于是就花了几分钟做了一个。 2.操作环境 越狱iPhone一台 frida m…

如何使用 JMeter 进行 HTTPS 请求测试?

本文将介绍如何使用 JMeter 测试 HTTPS 请求&#xff0c;并提供相关的技巧和注意事项。 在进行性能测试时&#xff0c;很多网站都采用了 HTTPS 协议。当我们测试 HTTPS 请求&#xff0c;如果服务端开启了双向认证&#xff0c;则需要客户端发送请求时带上证书。本文介绍如何在 …

机器学习-模型评估与选择

文章目录 评估方法留出法交叉验证自助法 性能的衡量回归问题分类问题查准率、查全率与F1ROC与AUC 在机器学习中&#xff0c;我们通常面临两个主要问题&#xff1a;欠拟合和过拟合。欠拟合指模型无法在训练数据上获得足够低的误差&#xff0c;通常是因为模型太简单&#xff0c;无…

从另外一个进程中读取数据

从另外一个进程中读取数据&#xff0c;其实就注入线程&#xff0c;寻址&#xff0c;解析内存&#xff0c;处理数据。例如这个就是从另外一个正在运行的进程中&#xff0c;读取数据并保存。实时性还可以。

C/C++新冠疫情死亡率 2020年9月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C新冠疫情死亡率 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C新冠疫情死亡率 2020年9月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 2020年全世界爆发了新冠疫情&#xff0c;请…

openEuler 22.03 LTS 安装 Docker CE 和 Dcoker Compose

openEuler 使用 DNF 安装 Docker CE 1024&#xff0c;节日快乐&#xff01;回归正题&#xff0c;DNF 安装 DockerOS 系统环境准备安装 docker-ce 步骤1、更新系统2、安装必要的软件包3、添加 Docker CE 存储库4、更新索引缓存并安装 Docker CE5、启动 Docker 服务6、查看 Docke…

当前JavaEE初阶的阶段知识总结

当前JavaEE初阶的阶段知识总结 多线程 文件IO 文件系统操作 ~~ File类. 文件内容操作 ~~ 读文件,写文件. IO 流对象. 流(Stream),形象的比喻,读取文件,就像水流一样,读写文件的时候,和水流类似,读100字节,可以一次读1个字节,100次完成;也可以一次读10个字节,10次完成…… 在…

用户案例 | 珍岛集团基于 Apache DolphinScheduler 打造智能营销云平台

珍岛集团致力于打造全球领先的智能营销云平台&#xff0c;在国内率先推出的Marketingforce&#xff08;营销力&#xff09;平台&#xff0c;专注于人工智能、大数据、云计算在数字营销及企业数字化智能化领域的创新与实践&#xff0c;面向全球企业提供营销力软件及服务&#xf…

python轻量规则引擎rule-engine入门与应用实践

rule-engine是一种轻量级、可选类型的表达式语言&#xff0c;具有用于匹配任意 Python 对象的自定义语法&#xff0c;使用python语言开发。 规则引擎表达式用自己的语言编写&#xff0c;在 Python 中定义为字符串。其语法与 Python 最相似&#xff0c;但也受到 Ruby 的一些启发…

Centos8 降低gcc版本至gcc-7.3

1 首先卸载系统中的gcc sudo yum remove gcc 2 重新安装gcc-7.3 sudo dnf group install “Development Tools” 然后再次卸载gcc sudo yum remove gcc 然后发现centos-release-scl-rh已经安装了 sudo yum install centos-release-scl-rh yum -y install devtoolset-7-gcc dev…

SCAU 编译原理 实验1 词法分析实验

实验内容&#xff1a;参考附录C.1 设计一个简单语言的词法分析程序&#xff0c;要求能够正确处理关键字、运算符&#xff08;单个符号的和复合的运算符如>、>&#xff09;、分界符、标识符、常数等单词&#xff0c;以及不是单词的换行回车、注释。 #include<stdio.h&…

【自然语言处理】理解词向量、CBOW与Skip-Gram模型

文章目录 一、词向量基础知识1.1 One-hot表示1.2 Distributed表示 二、word2vec基础知识2.1 CBOW和Skip-gram 三、基于Hierarchical Softmax的 CBOW 模型和 Skip-gram 模型3.1 CBOW 模型3.2 Skip-gram 模型 参考资料 由于计算机不能直接对各种字符进行运算&#xff0c;为此需要…

Java8实战-总结44

Java8实战-总结44 CompletableFuture&#xff1a;组合式异步编程Future 接口Future 接口的局限性使用 CompletableFuture 构建异步应用 CompletableFuture&#xff1a;组合式异步编程 最近这些年&#xff0c;两种趋势不断地推动我们反思我们设计软件的方式。第一种趋势和应用运…