JVM 虚拟机(二)类的生命周期

类的声明周期描述了一个类加载、使用和卸载的整个过程。
一个类的声明周期包括五个阶段:加载、连接、初始化、使用、卸载,其中连接部分分为验证、准备和解析阶段。

加载阶段

  1. 加载阶段是第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码文件 。
    1. 不同的渠道比如有:本地的文件、通过动态代理生成的类、通过网络传输的类(早期 Applet 技术使用)。
  2. 类加载器在加载完类之后,Java 虚拟机会讲字节码中的信息保存到方法区
  3. 生成一个 InstanceKlass 对象,保存类的所有信息,其中还包含实现特定功能比如多态的信息。
    1. 一个类有基本信息、常量池、字段、方法、虚方法表(多态)
  4. 同时,Java 虚拟机会在中声称一份与方法区中数据类似的
    java.lang.Class对象。可以在代码中获取类的信息以及存储静态字段的数据。

image.png

连接阶段

验证阶段

  1. 连接的第一个阶段是验证,验证的主要目的是检测 Java 字节码文件是否遵守了《Java 虚拟机规范》中的约束。这个阶段一般不需要程序员的参与
  2. 主要包含如下四种部分:
    1. 文件格式的验证,比如文件是否是以 0xCAFEBABE 开头的,主次版本号是否符合当前虚拟机版本的要求
    2. 元信息验证,例如类必须有父类(super 不能为空)
    3. 验证程序执行指令的语义,比如方法内的指令中跳转到不正确的位置
    4. 符号引用验证,比如是否访问了其他类的 private 方法等

image.png

准备阶段

准备阶段为静态变量(static)分配内存并设置初始值
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
基本类型的初始值
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
但如果基本数据类型是 final修饰的化,准备阶段会讲代码中的值进行赋值

解析

解析阶段主要是讲常量池中的符号引用替换成直接引用
符号应用就是在字节码文件中使用编号来访问常量池中的内容
image.png
转换成内存的地址来进行直接引用
image.png

初始化阶段

执行流程

初始化阶段会执行静态代码块中的代码,并且为静态变量赋值
初始化阶段会执行字节码文件中 clinit 部分的字节码指令
image.png
image.png
通过查看 clinit 中的字节码指令,可以看出在初始化阶段的执行流程:

iconst_1 // 先将 1 放到操作数栈
putstatic #2 // 将操作数栈中的值放到静态变量 valuie 中
// 静态代码块
iconst_2 // 将 2 放到操作数栈
putstatic #2 // 将操作数栈中的数放到 value 中
return

需要注意的是 clinit 中的方法的执行顺序是和 Java 中编写的顺序是一致的

类初始化的条件

  1. 访问一个类的静态变量或者静态方法,注意变量是 final 修饰的时候等号右边是变量不会触发初始化(final 在连接阶段的准备阶段就已经被赋值)
  2. 调用 Class.forName(String className)
  3. new 关键字来创建一个对象的时候
  4. 执行 Main 方法的当前类(程序的入口)

访问一个类的静态变量或者静态方法

package com.kq.init;public class ways {public static void main(String[] args) {System.out.println(Demo01.i);System.out.println(Demo02.i);}
}
class Demo01 {static {System.out.println("Demo01类被初始化了");}public static int i = 0;
}
class Demo02 {static {System.out.println("Demo02类被初始化了");}public final static int i = 0;
}

运行结果:

Demo01类被初始化了
0
0

其他方法

package com.kq.init;public class ways {static {System.out.println("主方法的类被初始化");}public static void main(String[] args) throws ClassNotFoundException {//        System.out.println(Demo01.i);
//        System.out.println(Demo02.i);Class<?> aClass = Class.forName("com.kq.init.Demo02");Demo01 demo01 = new Demo01();}
}
class Demo01 {static {System.out.println("Demo01类被初始化了");}public static int i = 0;
}
class Demo02 {static {System.out.println("Demo02类被初始化了");}public final static int i = 0;
}

运行结果:

主方法的类被初始化
Demo02类被初始化了
Demo01类被初始化了

image.png
image.png
clinit 指令在特定的情况下不会出现,比如:

  1. 无静态代码块且无静态变量的赋值语句
  2. 有静态变量的声明但是没有赋值语句
  3. 静态变量的定义使用 final 关键字,这类变量会在准备阶段直接进行初始化
  4. 在子类直接访问父类中的静态变量,不会触发子类的初始化
    1. 子类的初始化在 clinit 调用之前会先调用父类的 clinit 方法

在这三种情况初始化不会执行0

package com.kq.init;public class extend {public static void main(String[] args) {System.out.println(Son.i);}
}
class Father {public static int i;
}
class Son extends Father {static {System.out.println("子类被初始化");}}

运行结果:

0

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

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

相关文章

区块链媒体:Web3.0时代的推广创新10爆款策略概览-华媒舍

随着Web3.0时代的到来&#xff0c;互联网推广正经历着一场创新的革命。在这个新的时代背景下&#xff0c;一系列全新的推广策略正在兴起&#xff0c;引领着市场的变革。本文将基于这一背景&#xff0c;为大家介绍Web3.0时代中的10大爆款推广策略概览。 1. 个性化推广 在Web3.0…

【MATLAB】SSA+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 SSAFFTHHT组合算法是一种基于奇异谱分析&#xff08;SSA&#xff09;、快速傅里叶变换&#xff08;FFT&#xff09;和希尔伯特-黄变换&#xff08;HHT&#xff09;的组合算法。 其中&am…

谈谈SQL的优化经验

目录 前言 表设计优化 索引优化 读写分离&#xff0c;主从复制优化 ​编辑sql语句优化 前言 SQL调优在项目中是比较常见的&#xff0c;SQL调优不仅仅包括SQL语句的编写&#xff0c;其中还应包括了数据库的表设计&#xff0c;数据库的配置架构&#xff08;主从复制&#xf…

pure::variants—产品平台化及变体管理工具

产品概述 pure::variants是德国pure-systems公司的产品&#xff0c;其目的是帮助企业实现对产品线的变体管理&#xff0c;提高企业项目资产的复用效率。pure::variants的核心理念是运用产品线管理方法对项目资产&#xff08;项目计划、需求、模型、功能模块、代码、测试用例&am…

如何将 MySQL 数据库转换为 SQL Server

本文解释了为什么组织希望将其 MySQL 数据库转换为 Microsoft SQL 数据库。本文接着详细介绍了尝试转换之前需要记住的事项以及所涉及的方法。专业的数据库转换器工具将帮助您快速将 MySQL 数据库记录转换为 MS SQL Server。 在继续之前&#xff0c;我们先讨论一下 MySQL 到 M…

Linux(centos)学习笔记(初学)

[rootlocalhost~]#:[用户名主机名 当前所在目录]#超级管理员标识 $普通用户的标识 Ctrlshift放大终端字体 Ctrl缩小终端字体 Tab可以补全命令 Ctrlshiftc/V复制粘贴 / &#xff1a;根目录&#xff0c;Linux系统起点 ls&#xff1a; #list列出目录的内容&#xff0c;通常用户查看…

单片机开发常用的软件构架

对于单片机程序来说&#xff0c;大家都不陌生&#xff0c;但是真正使用架构&#xff0c;考虑架构的恐怕并不多&#xff0c;随着程序开发的不断增多&#xff0c;架构是非常必要的。 一、时间片轮询法 介于前后台顺序执行法和操作系统之间的一种程序架构设计方案。该设计方案需能…

Modbus TCP工业RFID读写器的选型要点

Modbus TCP工业RFID读写器是一种采用Modbus TCP通信协议的RFID读写器。它可以通过TCP/IP网络与计算机或其它设备进行通信&#xff0c;实现远程读取和写入RFID标签数据的目的。 与传统的RFID读写器相比&#xff0c;Modbus TCP工业RFID读写器具有更远的读写距离、更高的读写灵敏度…

Flink Flink数据写入Kafka

一、环境准备 官网地址 flink官方集成了通用的 Kafka 连接器&#xff0c;使用时需要根据生产环境的版本引入相应的依赖 <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><flink.version>1.14.6</flink.version&g…

CCF编程能力等级认证GESP—C++1级—20230611

CCF编程能力等级认证GESP—C1级—20230611 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)时间规划累计相加 答案及解析单选题判断题编程题1编程题2 单选题…

关于小红书商单变现的一些答疑

AI小红书商单训练营也过去1个月了&#xff0c;今天给大家汇总几个常遇到的问题&#xff0c;希望对大家在运营过程中有所帮助。 1.账号封面是否要统一模版&#xff1f; 为了让账号主页呈现整洁美观的效果&#xff0c;建议统一封面设计&#xff0c;视频开头可以设置一个固定画面…

景联文科技:高质量垂直领域数据集助力AI技术突破

随着人工智能技术的飞速发展&#xff0c;垂直领域数据集在提升模型性能、解决领域问题、推动创新应用以及提升竞争力等方面的重要性日益凸显。 提高模型性能&#xff1a;垂直领域数据集专注于特定任务或领域&#xff0c;使用这些数据集进行训练可以让模型更好地理解和解决特定领…

redis应用-分布式锁

目录 什么是分布式锁 分布式锁的基本实现 引入过期时间 引入校验id 引入lua 引入看门狗 引入redlock算法 什么是分布式锁 在一个分布式系统中,也会涉及到多个节点访问同一个公共资源的情况,此时就需要通过锁来做互斥控制,避免出现类似于"线程安全"的问题. 而…

@Autowired注入多态

如IBizStudyService接口有多个实现类BizStudyServiceImpl和BizStudyServiceExImpl&#xff0c;在Autowired注入时要用Qualifier指定实现类名称。 Autowired Qualifier("BizStudyServiceImpl") private IBizStudyService bizStudyService; 在实现类定义时要加上名称…

【开源】基于Vue和SpringBoot的计算机机房作业管理系统

项目编号&#xff1a; S 017 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S017&#xff0c;文末获取源码。} 项目编号&#xff1a;S017&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课…

【QT】Qt类库的模块

目录 1.Qt基本模块 2.Qt附加模块 3.增值模块 4.技术预览模块 5.Qt工具 1.Qt基本模块 Qt基本模块是Qt在所有平台上的基本功能&#xff0c;它们在所有的开发平台和目标平台上都可用&#xff0c;在Qt5所有版本上是源代码和二进制兼容的。 Qtcore模块是Qt类库的核心&#xff0c;所有…

【2021研电赛】基于EAIDK-310的云端互联无人驾驶系统

本作品介绍参与极术社区的有奖征集|分享研电赛作品扩大影响力&#xff0c;更有重磅电子产品免费领取! 参赛单位&#xff1a;上海理工大学 参赛队伍&#xff1a;你说的都是对的 指导老师&#xff1a;蒋全 参赛队员&#xff1a;童锐&#xff0c;邹祖奇&#xff0c;胡涛 获奖情况&…

分享一个Python网络爬虫数据采集利器

前言 你是否曾为获取重要数据而感到困扰&#xff1f;是否因为数据封锁而无法获取所需信息&#xff1f;是否因为数据格式混乱而头疼&#xff1f;现在&#xff0c;所有这些问题都可以迎刃而解。让我为大家介绍一款强大的数据收集平台——亮数据Bright Data。 作为世界领先的数据…

聚观早报 |JFrog发布新功能;中科百孚减持龙芯中科股票

【聚观365】12月7日消息 JFrog发布新功能 中科百孚减持龙芯中科股票 商汤集团再回应做空报告 xAI融资新进展 苹果市值再次突破 JFrog发布新功能 流式软件公司、企业软件供应链平台提供商JFrog发布新功能&#xff0c;推出业界首款致力于加速安全软件建构与发布的端到端平台…

什么是神经网络的超参数

1 引言 超参数在神经网络的设计和训练中起着至关重要的作用。它们是在开始训练之前设置的参数&#xff0c;与网络的结构、训练过程和优化算法有关。正确的超参数选择对于达到最优模型性能至关重要。 2 神经网络结构的超参数 层数&#xff08;Layers&#xff09;&#xff1a; 决…