【实战JVM】类的生命周期

在这里插入图片描述



个人名片:

在这里插入图片描述


🐼作者简介:一名大三在校生,喜欢AI编程🎋
🐻‍❄️个人主页🥇:落798.
🐼个人WeChat:hmmwx53
🕊️系列专栏:🖼️

  • 零基础学Java——小白入门必备🔥
  • 重识C语言——复习回顾🔥
  • 计算机网络体系———深度详讲
  • HCIP数通工程师-刷题与实战🔥🔥🔥
  • 微信小程序开发——实战开发🔥
  • 系统SSM框架学习——精通Spring🔥🔥🔥
  • HarmonyOS 4.0 应用开发实战——实战开发🔥🔥🔥
  • Redis快速入门到精通——实战开发🔥🔥🔥
  • RabbitMQ快速入门🔥
    🐓每日一句:🍭我很忙,但我要忙的有意义!
    欢迎评论 💬点赞👍🏻 收藏 📂加关注+


文章目录

  • 类的生命周期
      • 1、 加载阶段
      • 2、 连接阶段
      • 3、验证
      • 4、准备
      • 5、解析
      • 6、初始化阶段
    • 欢迎添加微信,加入我的核心小队,请备注来意


类的生命周期

类的生命周期描述了一个类加载、使用、卸载的整个过程。整体可以分为:

  • 加载
  • 连接,其中又分为验证、准备、解析三个子阶段
  • 初始化
  • 使用
  • 卸载

在这里插入图片描述

1、 加载阶段

1、加载(Loading)阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息,程序员可以使用Java代码拓展的不同的渠道。

  • 从本地磁盘上获取文件
  • 运行时通过动态代理生成,比如Spring框架
  • Applet技术通过网络获取字节码文件
    2、类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到方法区中,方法区中生成一个InstanceKlass对象,保存类的所有信息,里边还包含实现特定功能比如多态的信息。

在这里插入图片描述

4、Java虚拟机同时会在堆上生成与方法区中数据类似的java.lang.Class对象,作用是在Java代码中去获取类的信息以及存储静态字段的数据(JDK8及之后)。

在这里插入图片描述

2、 连接阶段

连接阶段分为三个子阶段:

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

在这里插入图片描述

3、验证

验证的主要目的是检测Java字节码文件是否遵守了《Java虚拟机规范》中的约束。这个阶段一般不需要程序员参与。主要包含如下四部分,具体详见《Java虚拟机规范》:
1、文件格式验证,比如文件是否以0xCAFEBABE开头,主次版本号是否满足当前Java虚拟机版本要求。

在这里插入图片描述

2、元信息验证,例如类必须有父类(super不能为空)。
3、验证程序执行指令的语义,比如方法内的指令执行中跳转到不正确的位置。
4、符号引用验证,例如是否访问了其他类中private的方法等。

对版本号的验证,在JDK8的源码中如下:

在这里插入图片描述

编译文件的主版本号不能高于运行环境主版本号,如果主版本号相等,副版本号也不能超过。

4、准备

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

如下代码:

public class Student{public static int value = 1;}

在准备阶段会为value分配内存并赋初值为0,在初始化阶段才会将值修改为1。

final修饰的基本数据类型的静态变量,准备阶段直接会将代码中的值进行赋值。
如下例子中,变量加上final进行修饰,在准备阶段value值就直接变成1了,因为final修饰的变量后续不会发生值的变更。

在这里插入图片描述

来看这个案例:

public class HsdbDemo {public static final int i = 2;public static void main(String[] args) throws IOException, InstantiationException, IllegalAccessException {HsdbDemo hsdbDemo = new HsdbDemo();System.out.println(i);System.in.read();}
}

从字节码文件也可以看到,编译器已经确定了该字段指向了常量池中的常量2:

在这里插入图片描述

5、解析

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

在这里插入图片描述

直接引用不在使用编号,而是使用内存中地址进行访问具体的数据。

在这里插入图片描述

6、初始化阶段

初始化阶段会执行字节码文件中clinit(class init 类的初始化)方法的字节码指令,包含了静态代码块中的代码,并为静态变量赋值。
如下代码编译成字节码文件之后,会生成三个方法:

public class Demo1 {public static int value = 1;static {value = 2;}public static void main(String[] args) {}
}

在这里插入图片描述

  • init方法,会在对象初始化时执行
  • main方法,主方法
  • clinit方法,类的初始化阶段执行

继续来看clinit方法中的字节码指令:
1、iconst_1,将常量1放入操作数栈。此时栈中只有1这个数。

在这里插入图片描述
2、putstatic指令会将操作数栈上的数弹出来,并放入堆中静态变量的位置,字节码指令中#2指向了常量池中的静态变量value,在解析阶段会被替换成变量的地址。

在这里插入图片描述

3、后两步操作类似,执行value=2,将堆上的value赋值为2。

如果将代码的位置互换:

public class Demo1 {static {value = 2;}public static int value = 1;public static void main(String[] args) {}
}

字节码指令的位置也会发生变化:

在这里插入图片描述

这样初始化结束之后,最终value的值就变成了1而不是2。

以下几种方式会导致类的初始化:
1.访问一个类的静态变量或者静态方法,注意变量是final修饰的并且等号右边是常量不会触发初始化。
2.调用Class.forName(String className)。
3.new一个该类的对象时。
4.执行Main方法的当前类。
添加-XX:+TraceClassLoading 参数可以打印出加载并初始化的类


欢迎评论 💬点赞👍🏻 收藏 📂加关注+



在这里插入图片描述

欢迎添加微信,加入我的核心小队,请备注来意

👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

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

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

相关文章

百度OCR身份证识别C++离线SDKV3.0 C#对接

百度OCR身份证识别C离线SDKV3.0 C#对接 目录 说明 效果 问题 项目 代码 下载 说明 自己根据SDK封装了动态库,然后C#调用。 SDK 简介 本 SDK 适应于于 Windows 平台下的⾝份证识别系统,⽀持 C接⼜开发的 SDK,开发者可在VS2015 下⾯进⾏开发(推荐…

【Java基础题型】遍历1000以内的完数

一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6123,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子 输入格式 N 输出格式( …

研究下福克斯的油耗

1.分析 09款1.8MT福克斯的真实油耗 https://zhidao.baidu.com/question/107309076 发改委的是匀速油耗 如果单纯是在市区行驶,还要看路况,经常塞车,红绿灯多等等,这样油耗就高了,一百公里起码10-11升 如果是在高速行…

推荐学习什么编程语言?

选择编程语言学习时,除了就业因素外,还可以考虑以下几个方面来决定学习哪些编程语言: 个人兴趣与目标:如果你对某个特定领域感兴趣,比如游戏开发、数据分析、人工智能等,可以选择与该领域紧密相关的编程语言…

Altair® Access™ 面向研究人员和工程师的 HPC 作业提交门户

Altair Access™ 面向研究人员和工程师的 HPC 作业提交门户 Access 具有一个简单、强大且统一的界面,可以从中提交和监控远程集群、云或其他资源的相关作业,使工程师和研究人员能够专注于主要活动,减少在应用程序运行及数据移动上投入的时间。…

搭建第一个Web服务器(在eclipse或idea上部署Tomcat服务器)

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

二维数组得学习

二维数组可以看作是一维数组的扩展,其元素本身又是一维数组。具体来说,一个m行n列的二维数组,既可以视为由m个一维数组(行)所组成的线性表,也可以视为由n个一维数组(列)所组成的线性…

算法练习第五十天|123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

123. 买卖股票的最佳时机 III 188. 买卖股票的最佳时机 IV 123.买卖股票的最佳时机III class Solution {public int maxProfit(int[] prices) {//dp[i][j] 第i天买卖股票获得的最大利润/**j0不操作j1第一次持有j2第一次不持有j3第二次持有j4第二次不持有dp[i][0] dp[i-1][0]d…

518. 零钱兑换 II(力扣LeetCode)

文章目录 518. 零钱兑换 II题目描述动态规划一维数组为什么不能交换两个for循环的顺序? 二维数组 518. 零钱兑换 II 题目描述 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数…

2024年ERP软件上中下游结构分析及细分行业研究

环洋咨询Global Info Research的ERP软件市场调研报告提供ERP软件市场的基本概况,包括定义,分类,应用和产业链结构,同时还讨论发展政策和计划以及制造流程和成本结构,分析ERP软件市场的发展现状与未来市场趋势&#xff…

nandgame中的条件判断EQ(== 相等)、GT、LT、NOT、GOTO、IF_GOTO

相等从堆栈中弹出两个顶部值并进行比较。 如果它们相等,则推送值-1(十六进制中的FFFF)。 否则推送0。在条件语句中,FFFF代表真,0代表假。示例 之前 之后 堆栈 堆栈 7 0 8 结果如下: 代码 POP_D POP_A…

AI大模型探索之路-应用篇8:Langchain框架LangServe模块-专注于AI模型的部署

目录 前言 一、概述 二、功能特性 三、REST API 开发 四、Postman调用测试 五、Client调用测试 总结 前言 随着AI大语言模型(LLM)的技术的不断演进,AI应用的开发和部署变得越来越复杂。在这样的背景下,LangServe应运而生—…

设计模式——2_7 状态(State)

欲买桂花同载酒,终不似,少年游 ——刘过《唐多令芦叶满汀州》 文章目录 定义图纸一个例子:如何模拟一个转笔刀自动转笔刀PencilPencilSharpener 投诉和改善钝刀BladePencilSharpener 没有铅笔PencilSharpener if if ifStatePencilSharpener 碎…

python 读取文件内容每一行,写入另一个文件内

场景 想要利用 python 读取指定文件的中的内容,格式自行解析,然后将读取到的内容整理后再写入另一个文件中 步骤 读取文件将读取出来的每一行内容自定义修改一下将修改后的内容写入到另一个文件中 本地测试代码 # 打开源文件并读取其内容 with open…

48-基于腾讯云EKS的容器化部署实战

准备工作 在部署IAM应用之前,我们需要做以下准备工作: 开通腾讯云容器服务镜像仓库。安装并配置Docker。准备一个Kubernetes集群。 开通腾讯云容器服务镜像仓库 在Kubernetes集群中部署IAM应用,需要从镜像仓库下载指定的IAM镜像&#xff…

亚马逊、速卖通、lazada测评自养号与机刷有何区别?

在亚马逊平台,买家评价的重要性无需多言。许多消费者在决定购买产品前,都会习惯性地查看相关评论,对比同类产品的买家反馈,从而做出更明智的选择。正因如此,测评成为各大电商平台不可或缺的一种推广策略,亚…

蓝桥杯备考day3

1.1 DFS模板(深度优先遍历) 模板 全局状态变量 void dfs(当前状态) {if(当前状态是目标状态) // 判断进行相应处理(输出当前解、更新最优解、退出返回等)// 扩展for(所有可行的新状态){if(新状态没有访问过 && 需要访问…

C++ 模拟实现 STL 中的 set、map 与 multiset、multimap

目录 一,RB_tree 的实现 1,RB_tree 的节点与数据结构 2,RB_tree 的迭代器 3,RB_tree 的构造 4,RB_tree 的元素操作 5,完整代码 二,set 与 multiset 的实现 1,set 2&#x…

从零开始:Elasticsearch简介与详解

大家好,我是小米,今天我来和大家聊一聊阿里巴巴面试题中常见的一个话题:Elasticsearch。作为一名喜欢分享技术的小伙伴,我深知在技术的道路上,多一份了解就多一份优势。那么,让我们一起来探索一下Elasticsearch的特点、功能、场景以及与竞品的对比分析吧! 特点 特点是…

js爬虫puppeteer库 解决网页动态渲染无法爬取

我们爬取这个网址上面的股票实时部分宇通客车(600066)_股票价格_行情_走势图—东方财富网 我们用正常的方法爬取会发现爬取不下来,是因为这个网页这里是实时渲染的,我们直接通过网址接口访问这里还没有渲染出来 于是我们可以通过下面的代码来进行爬取: …