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…

Stable Diffusion WebUI常用Tag收集

捆绑(nsfw)*可以直接加人物lora Masterpiece, high quality, beautiful wallpaper, 16k, animation, illustration, positive perspective, perfect body, complete body, detailed face, delicate features, (solo:1.2), ((1girl)), thin, sexy, (medium to large breasts :1…

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

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

HTML试题——附答案

HTML试题题目 1. HTML是什么意思&#xff1f;它是什么类型的语言&#xff1f; 2. 请解释HTML标签和元素之间的区别。 3. 以下HTML标记用于什么目的&#xff1f; <!DOCTYPE html> <html> <head><title>我的网页</title> </head> <bo…

什么是 performance_schema ?

MySQL的performance_schema是运行在较低级别的用于监控MySQL Server运行过程中的资源消耗、资源等待等情况的一个功能特性&#xff0c;它具有以下特点。 performance_schema提供了一种在数据库运行时实时检查Server内部执行情况的方法。performance_schema数据库中的表使用per…

Redis研学-认识与安装

一 NoSql-非关系型数据库 1 NoSql特点&#xff1a;解耦 数据模型简单&#xff0c;灵活性更强&#xff0c;对数据库的性能要求比较高(可能出现数据不一致或丢数据)&#xff0c;不需要高度的数据一致性&#xff0c;对给定的key比较容易映射到更复杂的环境 优点&#xff1a; 对数…

WordPress发布文件随机设置作者昵称信息

我们是否看到有些明显是个人网站&#xff0c;但是他有很多的发布者。其实这个都是他个人发布的&#xff0c;只是选择的不同用户&#xff0c;感觉这个网站是多人编辑的。包括我们看到有些明显是采编采集的网站&#xff0c;他们就说是投稿的&#xff0c;实际上哪里有人投稿&#…

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

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

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

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

DTD文档约束讲解及其使用案例

DTD&#xff08;Document Type Definition&#xff09;文档类型定义是一种用于描述XML文档结构的语法规则。它定义了XML文档的元素、属性和实体等的规范格式。在XML中&#xff0c;可以将DTD定义在XML文档中或者在一个单独的外部文件中&#xff0c;以便在多个XML文档中共享。 下…

Restarting Application Engine Programs 重新启动应用程序引擎程序

Restarting Application Engine Programs 重新启动应用程序引擎程序 A key feature of Application Engine is its built-in checkpoint and restart capabilities. If a program step terminates abnormally or fails, you can restart the request from the last successf…

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算法 什么是分布式锁 在一个分布式系统中,也会涉及到多个节点访问同一个公共资源的情况,此时就需要通过锁来做互斥控制,避免出现类似于"线程安全"的问题. 而…