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

【JVM】类的生命周期

【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 参数可以在控制台打印出加载并初始化的类

相关文章:

【JVM】类的生命周期

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

asp.net网上商城系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio协同过滤设计

一、源码特点 asp.net网上商城系统是一套完善的web设计管理系统系统采用协同过滤算法进行商品推荐,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库 为sqlserver2008,使用c#语言开发 ASP…...

APUS入驻百度灵境矩阵,普惠AI大模型插件能力

10月17日,APUS出席百度世界大会2023。会上,百度公布了灵境矩阵业务进展,APUS作为灵境矩阵首批合作伙伴正与百度携手拓展大模型能力边界、构建大模型应用生态。 百度认为,大模型将繁荣AI应用生态,在生态搭建过程中&…...

通过C++调用Com接口

头文件 #include <iostream> #include <Windows.h> #include <comdef.h> #include <rpcdce.h> using namespace std; #pragma comment(lib, "Rpcrt4.lib")72C24DD5-D70A-438B-8A42-98424B88AFB8 通过Wscript.Shell来创建进程: void Wscri…...

完全背包问题

目录 1. 朴素解法 2. 优化 原题链接&#xff1a; 3. 完全背包问题 - AcWing题库 题目描述&#xff1a; 有 N 种物品和一个容量是 V 的背包&#xff0c;每种物品都有无限件可用。 第 i 种物品的体积是 vi&#xff0c;价值是 wi。 求解将哪些物品装入背包&#xff0c;可使这些…...

J2EE的N层体系结构

J2EE平台采用了多层分布式应用程序模型&#xff0c;实现不同逻辑功能的应用程序被封装到不同的构件中&#xff0c;处于不同层次的构件可被分别部署到不同的机器中。 RMI/IIOP&#xff1a;RMI&#xff08;Remote Method Invocation&#xff0c;远程方法调用&#xff09;是Java的…...

Quirks(怪癖)模式是什么?它和 Standards(标准)模式有什么区别?

目录 前言: 用法: 代码: Quirks模式示例: Standards模式示例: 理解: Quirks模式&#xff1a; Standards模式&#xff1a; 高质量讨论: 前言: "Quirks模式"和"Standards模式"是与HTML文档渲染模式相关的两种模式。它们影响着浏览器如何解释和渲染HT…...

自然语言处理---Transformer模型

Transformer概述 相比LSTM和GRU模型&#xff0c;Transformer模型有两个显著的优势&#xff1a; Transformer能够利用分布式GPU进行并行训练&#xff0c;提升模型训练效率。 在分析预测更长的文本时&#xff0c;捕捉间隔较长的语义关联效果更好。 Transformer模型的作用 基于seq…...

动画系统的前世今生(一)

掐指一算&#xff0c;五年没更新过我的CSDN账号啦&#xff0c;方向也从人工智能变成了计算机图形学&#xff0c;当然也依旧会关注AI的发展&#xff0c;之前在知乎上写了一些文章[传送门]&#xff0c;后续也会逐渐同步到CSDN上&#xff5e; 这个系列将包含五篇文章&#xff0c;内…...

11 结构型模式- 代理模式

结构性模式一共包括七种&#xff1a; 代理模式、桥接模式、装饰者模式、适配器模式、门面(外观)模式、组合模式、和享元模式。 1 代理模式介绍 软件开发中的代理&#xff1a; 代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到了中介的作用,它去掉客…...

Unity--用户界面

目录 “使用工具栏”&#xff1a; “层次结构”窗口&#xff1a; 层次结构窗口 制作子GameObject “游戏”视图&#xff1a; “场景视图“&#xff1a; ”项目窗口“&#xff1a; 项目窗口工具栏&#xff1a; "Inspector" 窗口&#xff1a; Inspector 游戏…...

BUUCTF 乌镇峰会种图 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 乌镇互联网大会召开了&#xff0c;各国巨头汇聚一堂&#xff0c;他们的照片里隐藏着什么信息呢&#xff1f;&#xff08;答案格式&#xff1a;flag&#xff5b;答案&#xff5d;&#xff0c;只需提交答案&#xff0…...

Runner GoUI自动化测试发布

构建自动化测试体系是当下每个项目团队愿意去做的&#xff0c;自动化测试减少重复操作节省人力成本。 RunnerGo UI自动化平台 RunnerGo提供从API管理到API性能再到可视化的API自动化、UI自动化测试功能模块&#xff0c;覆盖了整个产品测试周期。 RunnerGo UI自动化基于Selen…...

【Gensim概念】03/3 NLP玩转 word2vec

第三部分 对象函数 八 word2vec对象函数 该对象本质上包含单词和嵌入之间的映射。训练后&#xff0c;可以直接使用它以各种方式查询这些嵌入。有关示例&#xff0c;请参阅模块级别文档字符串。 类型 KeyedVectors 1&#xff09; add_lifecycle_event(event_name, log_level2…...

【网络协议】聊聊网络路由相关算法

如何配置路由 路由器是一台网络设备&#xff0c;多张网卡&#xff0c;当一个入口的网络包到达路由器时&#xff0c;会根据本地的信息库决定如何正确的转发流量&#xff0c;通常称为路由表 路由表主要包含如下 核心思想是根据目的 IP 地址来配置路由 目的网络&#xff1a;要去…...

Python 深度学习入门之CNN

CNN 前言一、CNN简介1、简介2、结构 二、CNN简介1、输出层2、卷积层3、池化层4、全连接层5、输出层 前言 1024快乐&#xff01;1024快乐&#xff01;今天开新坑&#xff0c;学点深度学习相关的&#xff0c;说下比较火的CNN。 一、CNN简介 1、简介 CNN的全称是Convolutiona…...

国产开发板上打造开源ThingsBoard工业网关--基于米尔芯驰MYD-JD9X开发板

本篇测评由面包板论坛的优秀测评者“JerryZhen”提供。 本文将介绍基于米尔电子MYD-JD9X开发板打造成开源的Thingsboard网关。 Thingsboard网关是一个开源的软件网关&#xff0c;采用python作为开发语言&#xff0c;可以部署在任何支持 python 运行环境的主机上&#xff0c;灵…...

英语——语法——从句——名词性从句——笔记

文章目录 名词性从句一、定义二、分类&#xff08;一&#xff09;宾语从句&#xff08;二&#xff09;主语从句&#xff08;三&#xff09;C同位语从句&#xff08;四&#xff09;D表语从句 名词性从句 一、句子成分 简而言之&#xff0c;构成一个句子的成分&#xff08;或要素…...

PROSTATEx-2 上前列腺癌的 3D CNN 分类

内容 本文介绍了在多参数 MRI 序列上使用 3D CNN 对前列腺癌进行显着性或不显着性分类。内容如下: 数据集描述Dicom 到 Nifti 文件格式的转换不同 MRI 序列的联合配准...

npm ERR! node-sass@6.0.1 postinstall: `node scripts/build.js`

1.遇到的问题 vue npm install提示以下错误 2.首次尝试方法 尝试用下面的方式重新安装弄得-saas&#xff0c;结果不起作用 。 npm config set sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass npm install node-sass 这时考虑降级node版本&#xff0c;node.js从…...

瑞芯微RK3588硬件设计资料概览

瑞芯微RK3588硬件设计资料 瑞芯微RK3588硬件设计资料资料包括&#xff1a;原理图和PCB以及叠层设计说明&#xff0c;硬件设计指导书等原理图和pcb用cadence打开该原理图和pcb基于网络硬盘录像机项目设计可作为RK3588学习者作为参考电路使用&#xff0c;或者学习高速电路者学习使…...

告别subfloat!LaTeX中minipage+subfigure排版多图的最佳实践

LaTeX多图排版进阶指南&#xff1a;minipage与subfigure的黄金组合 在学术论文和技术文档写作中&#xff0c;图片排版往往是让人头疼的问题。特别是当需要处理多张图片并为其添加子标题时&#xff0c;传统的subfloat方法常常会遇到标题溢出、无法自动换行等令人沮丧的情况。本文…...

无损图像转PDF新方案:img2pdf工具全攻略

无损图像转PDF新方案&#xff1a;img2pdf工具全攻略 【免费下载链接】img2pdf mirror of https://gitlab.mister-muffin.de/josch/img2pdf for Travis and appveyor CI 项目地址: https://gitcode.com/gh_mirrors/im/img2pdf 在数字文档处理领域&#xff0c;图像转PDF的…...

磁流变半主动悬架Simulink模型构建与策略设计概述

磁流变半主动悬架simulink模型&#xff0c;包含模型创建&#xff0c;模型策略设计磁流变悬架的Simulink建模就像搭积木——你得先搞清楚每块积木该放哪儿。咱们从最基础的四分之一车模型开始&#xff0c;车身质量、悬架刚度这些参数直接在Simulink里拖几个Mass和Spring模块就能…...

快马平台十分钟搭建vmware虚拟机web管理原型,告别环境配置烦恼

最近在做一个虚拟化相关的项目&#xff0c;需要快速搭建一个VMware虚拟机管理工具的原型。传统方式需要本地安装各种软件&#xff0c;配置环境特别麻烦。后来发现用InsCode(快马)平台可以十分钟搞定&#xff0c;分享下我的实现过程。 项目规划 首先明确原型需要实现的核心功能&…...

VirtualLab进阶实验指南:单缝衍射参数优化与动态仿真

1. VirtualLab单缝衍射实验入门指南 第一次接触VirtualLab进行单缝衍射仿真时&#xff0c;我完全被那些复杂的参数搞懵了。后来才发现&#xff0c;只要掌握几个关键点&#xff0c;就能轻松看到漂亮的衍射条纹。先说说最基本的实验搭建&#xff1a; 在VirtualLab中新建一个空白项…...

知识管理新范式:dedao-dl实现得到课程资源备份与永久归档指南

知识管理新范式&#xff1a;dedao-dl实现得到课程资源备份与永久归档指南 【免费下载链接】dedao-dl 得到 APP 课程下载工具&#xff0c;可在终端查看文章内容&#xff0c;可生成 PDF&#xff0c;音频文件&#xff0c;markdown 文稿&#xff0c;可下载电子书。 项目地址: htt…...

麒麟系统根目录权限误改777?3步快速修复(附完整命令)

麒麟系统根目录权限误改777&#xff1f;3步快速修复&#xff08;附完整命令&#xff09; 当你在深夜维护麒麟系统时&#xff0c;一个不经意的chmod -R 777 /命令可能让整个系统陷入权限混乱。作为经历过这种噩梦的运维老兵&#xff0c;我总结出一套最快能在15分钟内恢复系统权限…...

Snap.Hutao:如何用这款开源工具箱优化你的原神游戏体验?

Snap.Hutao&#xff1a;如何用这款开源工具箱优化你的原神游戏体验&#xff1f; 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 &#x1f9f0; / Multifunctional Open-Source Genshin Impact Toolkit &#x1f9f0; 项目地址: https://gitcode.com/GitHub_Trendin…...

百考通:AI赋能答辩PPT,让研究更顺畅

毕业季、开题季&#xff0c;一份专业出彩的PPT是顺利通过答辩的关键。但从论文中提炼核心观点、规划答辩逻辑、设计美观版式&#xff0c;往往让学生们焦头烂额。百考通&#xff08;https://www.baikaotongai.com&#xff09; 凭借AI技术深度赋能&#xff0c;打造出一站式答辩PP…...