JVM工作原理与实战(六):类的生命周期-连接阶段

专栏导航

JVM工作原理与实战

RabbitMQ入门指南

从零开始了解大数据


目录

专栏导航

前言

一、类的生命周期

1.加载(Loading)

2.连接(Linking)

3.初始化(Initialization)

4.使用(Using)

5.卸载(Unloading)

二、连接阶段

1.验证

2.准备

3.解析

总结


前言

JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了类的生命周期、类的连接阶段等内容。


一、类的生命周期

类的生命周期描述了一个类加载、连接、初始化、使用、卸载的整个过程。

1.加载(Loading)

加载阶段是类的生命周期的起始点。当应用程序首次需要使用某个类时,Java虚拟机(JVM)会负责加载这个类。加载是通过类的加载器(ClassLoader)完成的,它会查找并加载类的二进制数据。这个过程包括将类的字节码从文件系统、JAR文件或网络加载到内存中。

2.连接(Linking)

连接阶段是加载阶段的后续,它包括验证、准备和解析三个子阶段。

  • 验证(Verification):验证阶段主要是确保被加载的类文件数据符合JVM规范,没有安全方面的隐患,以及是否与应用程序的其它部分兼容。验证过程包括文件格式验证、元数据验证、字节码验证和符号引用验证。
  • 准备(Preparation):准备阶段是为类的静态变量分配内存,并设置默认的初始值。需要注意的是,准备阶段并不会执行任何初始化操作。
  • 解析(Resolution):解析阶段是将符号引用转换为直接引用。在Java中,符号引用是一个类的全限定名,而直接引用是一个直接指向内存中的地址的指针。解析阶段发生在运行时,而不是编译时。

3.初始化(Initialization)

初始化阶段是类加载过程中的最后一步,当准备和解析阶段完成后,JVM会执行类的构造器方法,这个方法是由编译器自动收集类中的所有类变量的赋值动作和静态代码块集合来的。需要注意的是,构造器方法中的代码只在类被首次使用时执行一次。

4.使用(Using)

一旦类被成功加载、连接并初始化后,就可以被实例化并用于执行应用程序的业务逻辑。在应用程序运行期间,类可能会被频繁地使用。

5.卸载(Unloading)

当应用程序不再需要某个类时,该类的实例以及与其相关的资源将会被回收,这个过程就是卸载。但是需要注意的是,只有当一个类不再被任何活动对象所引用时,它才会被卸载。另外,JVM的垃圾回收机制(Garbage Collection, GC)负责自动处理类的卸载和资源的回收。

二、连接阶段

1.验证

在Java类的生命周期中,连接阶段是一个至关重要的环节,它确保了Java字节码文件在被Java虚拟机(JVM)加载前满足一定的规范和要求。连接阶段的首要任务是验证,这一过程对Java字节码文件进行了严格的检查,以确保其遵守《Java虚拟机规范》中定义的各种约束。这一验证过程通常对程序员是透明的,不需要他们直接参与。

验证过程主要包括以下四个部分:

  • 文件格式验证:这是验证的第一步,主要检查字节码文件的基本格式。例如,它会验证文件是否以特定的魔数(magic number)0xCAFEBABE开头,这是Java类文件的标识。此外,还会检查文件的主次版本号是否与当前Java虚拟机的版本兼容。版本号的检查是确保类文件是用与当前JVM兼容的Java编译器编译的。

  • 元数据验证:在这一步中,验证器会检查类的元数据信息。这包括类的继承关系、接口实现、字段和方法的存在性和访问权限等。例如,验证器会确保每个类都有父类(除了java.lang.Object),并且类的继承层次结构没有出现问题。此外,还会检查方法的字节码,确保它们不会执行非法的操作,如跳转到不正确的位置。

  • 字节码验证:这是最复杂的一步,验证器会深入分析方法的字节码,确保它们符合Java虚拟机的语义规则。这个过程会检查诸如类型安全、操作数栈的数据流和使用情况等。字节码验证的目的是防止潜在的恶意代码或由于编译器错误导致的无效代码被执行。
  • 符号引用验证:在这一步中,验证器会检查类文件中的符号引用。符号引用是类在编译时对其他类、方法或字段的引用,这些引用在类加载时会被解析为实际的内存地址。验证器会确保这些符号引用是有效的,例如,不会访问其他类的私有方法或不存在的字段。

在Hotspot JDK 8的虚拟机源码中,版本号的检测是通过一段特定的代码来实现的。这段代码确保了主版本号(major version)和副版本号(minor version)都在Java虚拟机支持的范围内。具体来说,主版本号不能高于运行环境的主版本号,如果主版本号相等,则副版本号也不能超过运行环境所支持的最大副版本号。这样的版本号检测机制确保了类文件与运行环境的兼容性。

Hotspot JDK8中虚拟机源码对版本号检测的代码如下:

return (major >= JAVA_MIN_SUPPORTED_VERSION) && (major <= max_version) && ((major != max_version) || (minor <= JAVA_MAX_SUPPORTED_MINOR_VERSION));
major >= JAVA_MIN_SUPPORTED_VERSIONmajor(主版本号)大于或等于最小支持的Java版本
major <= max_versionmajor(主版本号)小于或等于最大支持的Java版本

(major != max_version) ||

(minor <= JAVA_MAX_SUPPORTED_MINOR_VERSION)

major(主版本号)不是最大支持版本,或者minor(次版本号)在最大支持范围内

验证阶段是Java类加载过程中非常重要的一环,它确保了只有符合规范的类文件才能被Java虚拟机加载和执行。这一过程不仅增强了Java平台的安全性,还提高了代码的健壮性和可移植性。

2.准备

准备阶段的主要任务是为类的静态变量分配内存,并设置这些变量的初始值。准备阶段只会为静态变量赋予初始值,而不是最终的值。每一种基本数据类型和引用数据类型在准备阶段都有其特定的初始值。

以下是基本数据类型和引用数据类型的初始值列表:

数据类型初始值
int0
long0L
short0
char‘\u0000’
byte0
booleanfalse
double0.0
引用数据类型null

这些初始值是Java虚拟机规范所规定的,它们在准备阶段被自动赋予给相应的静态变量。

然而,有一个特殊的情况需要注意,那就是被final修饰的基本数据类型的静态变量。在准备阶段,如果静态变量被final修饰,并且其值在编译时就已经确定,那么Java虚拟机将直接将该值赋给静态变量,而不是赋予初始值。这一特性使得被final修饰的静态变量在准备阶段就能获得其最终的值。

下面通过两个示例来说明这一点:

示例一(类Test包含一个普通的静态变量i):

public class Test {
    public static int i = 1;
    public static void main(String[] args) {
    }
}

对于这个示例,在准备阶段,静态变量i会被赋予其初始值0,而不是最终值1,最终值1的赋值发生在初始化阶段。

示例二(类Test包含一个被final修饰的静态变量i):

public class Test {
    public static final int i = 1;
    public static void main(String[] args) {
    }
}

对于这个示例,在准备阶段,静态变量i会被直接赋予其最终值1,因为它是一个编译时常量。这意味着在准备阶段完成后,静态变量i就已经获得了其最终的值,而不需要等到初始化阶段。

在Java类的生命周期的连接阶段中,准备阶段是一个关键步骤,它负责为静态变量分配内存并设置初始值。对于被final修饰的静态变量,如果其值在编译时就已经确定,那么准备阶段将直接赋予其最终值。这一特性为Java程序员提供了一种优化静态变量初始化的手段。

3.解析

解析阶段作为连接阶段的一部分,其主要任务是将常量池中的符号引用转换为直接引用

符号引用:

在Java字节码中,常量池用于存储各种常量,如字符串、类名等。这些常量在常量池中通过编号进行索引。在字节码文件中,这些索引被用作符号引用。例如,当我们在字节码中引用一个类时,实际上是通过一个在常量池中的索引来引用该类,这个索引被称为类符号引用。同样地,字段和方法的引用也是通过相应的符号引用来表示的。

直接引用:

与符号引用不同,直接引用是直接指向目标对象的指针或地址。这意味着直接引用是具体的、指向内存中的某个位置的地址。通过直接引用,JVM可以直接定位并访问目标对象,而不必通过一系列的索引和查找操作。

解析过程:

在解析阶段,JVM将常量池中的符号引用转换为直接引用,这一过程是由JVM自动完成的。JVM在解析阶段会遍历字节码中的指令,将遇到的符号引用替换为直接引用。这个过程涉及到在运行时解析符号引用,并获取目标对象的实际内存地址。

举个例子,如果字节码中有一个对某个类的字段的访问指令,那么在解析阶段,JVM会找到该字段的实际内存地址,并将该地址作为直接引用存储在相应的指令中。这样,当执行该指令时,JVM可以直接访问该字段,而不需要通过查找常量池来获取符号引用。

解析阶段是连接阶段中的关键环节之一,它确保了JVM能够高效地访问和操作目标对象。通过将符号引用转换为直接引用,JVM能够提高指令执行的速度并降低内存开销。这也是Java虚拟机实现高效运行的重要手段之一。


总结

JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了类的生命周期、类的连接阶段等内容,希望对大家有所帮助。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

目标检测开源数据集——海底垃圾识别

随着全球经济的快速发展&#xff0c;海洋垃圾问题日益严重。海洋垃圾不仅对海洋生态系统造成严重破坏&#xff0c;还威胁到人类的健康和生存。因此&#xff0c;海上垃圾识别变得至关重要。本文将详细介绍海上垃圾识别的重要性&#xff0c;从生态、经济、健康和社会四个方面进行…

机器学习原理到Python代码实现之LinearRegression

Linear Regression 线性回归模型 该文章作为机器学习的第一篇文章&#xff0c;主要介绍线性回归模型的原理和实现方法。 更多相关工作请参考&#xff1a;Github 算法介绍 线性回归模型是一种常见的机器学习模型&#xff0c;用于预测一个连续的目标变量&#xff08;也称为响应变…

matlab如何标定相机内外参和畸变参数

关于内外参矩阵和畸变矩阵可以学习 https://blog.csdn.net/qq_30815237/article/details/87530011?spm1001.2014.3001.5506 在APP中找到 camera Calibrator 点击 Add Images&#xff0c;导入拍照图片。标定20张左右就够了&#xff0c;然后角度变一下&#xff0c;但不需要变太…

向量数据库:usearch的简单使用+实现图片检索应用

usearch的简单使用 usearch是快速开源搜索和聚类引擎&#xff0c;用于C、C、Python、JavaScript、Rust、Java、Objective-C、Swift、C#、GoLang和Wolfram &#x1f50d;中的向量和&#x1f51c;字符串 // https://github.com/unum-cloud/usearch/blob/main/python/README.md …

20240107让Firefly的AIO-3399J开发板的Android11下配置为默认1080p录像

20240107让Firefly的AIO-3399J开发板的Android11下配置为默认1080p录像 2024/1/7 23:01 开发板&#xff1a;Firefly的AIO-3399J【RK3399】 SDK&#xff1a;rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab Androi…

【Unity美术】如何用3DsMax做一个水桶模型

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

让充电器秒供多个快充口,乐得瑞推出1拖2功率分配快充线方案

随着PD3.1协议的市场应用越来越多&#xff0c;一些充电器的Type-C接口的输出功率达到百瓦及以上&#xff0c;如何充分利用好这类充电器设备&#xff0c;乐得瑞电子推出1拖2快充线缆解决方案&#xff0c;支持智能功率分配策略支持私有快充协议。 如上图是乐得瑞1拖2功率分配快充…

二叉树与堆的深度解析:数据结构中的关键概念及应用

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 前言树概念注意&#xff1a; 树的基本概念及术语基本概念及术语以家谱为例 树的表示孩子兄弟表示法简介优势应用示例 树在实际中的运用文件系统的目录树…

Verilog学习记录

目录 一、Verilog简介 &#xff08;一&#xff09;Verilog 的主要特性 &#xff08;二&#xff09;Verilog的主要应用 &#xff08;三&#xff09;Verilog设计方法 二、Verilog基础语法 &#xff08;一&#xff09;标识符和关键字 &#xff08;二&#xff09;Verilog数据…

创建Vue3项目

介绍 使用命令创建vue3项目 示例 第一步&#xff1a;执行创建项目命令 npm create vuelatest第二步&#xff1a;填写输入项 第三步&#xff1a;进入study-front-vue3文件夹 cd study-front-vue3第四步&#xff1a;执行npm命令安装依赖 npm install第五步&#xff1a;运行…

LLM 幻觉现象及 RAG 解决方案

1. 幻觉现象及原因 什么是幻觉(hallucination)现象? 大模型的回答有编造成分或错误. 比如问 “tensorflow 1.12 版本有 xxx 这个api 么”, 模型回答 “有”, 其实没有. 原因 训练语料质量低, 本身有错误答案存在.LLM 的训练并不关注 “事实是否正确”, 自然不能保证生成答案一…

OpenMMlab导出PointPillars模型并用onnxruntime推理

导出onnx文件 通过mmdeploy的tool/deploy.py脚本容易转换得到PointPillars的end2end.onnx模型。 根据https://github.com/open-mmlab/mmdeploy/blob/main/docs/zh_cn/04-supported-codebases/mmdet3d.md显示&#xff0c;截止目前 mmdet3d 的 voxelize 预处理和后处理未转成 o…

【APACHE】的认识和基础配置参数

#主页传送:江南的江 #每日鸡汤&#xff1a;人生没有如果和假设&#xff0c;只有后果和结果。生活有进有退&#xff0c;输什么也不能输心情。生活简单就是迷人的&#xff0c;学会简单其实就是不简单。要学会平静地接受现实&#xff0c;学会对自己说声顺其自然&#xff0c;学会坦…

Selenium安装WebDriver:ChromeDriver谷歌浏览器驱动下载安装与使用最新版118/119/120

Selenium安装WebDriver&#xff1a;ChromeDriver谷歌浏览器驱动下载安装与使用最新版118/119/120 0. 背景 在使用之前的代码通过selenium操作Chrome浏览器时&#xff0c;安装中遇到了Chrome版本与浏览器驱动不匹配的的问题&#xff0c;在此记录安装下过程 1. 确定Chrome版本 …

海外跨境独立站和代购系统存在必然联系?独立站建站初期,以及如何运营好独立站。

海外跨境独立站和代购系统在多个方面存在差异&#xff1a; 定位&#xff1a;独立站是拥有独立域名&#xff0c;自主宣传推广媒体与渠道的新型网站&#xff0c;更侧重于培养买家&#xff0c;做品牌建设&#xff0c;相当于个体经营专卖店。而代购系统是利用先进的技术和流程管理…

3D软件坐标系速查【左手/右手】

本文介绍不同3D软件的世界坐标系之间的差异及其工作原理。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 基本上&#xff0c;游戏引擎和3…

【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax概述

【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax概述 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax快速入门 【大数据进阶第三阶段之Datax学习笔记】阿里云开源离线同步工具Datax类图 【大数据进阶第三阶段之Datax学习笔记】使用…

第11课 利用windows API捕获桌面图像并通过FFmpeg分享

在上一章&#xff0c;我们已经实现了一对一音视频对话功能。在实际应用中&#xff0c;我们常需要把自己的电脑桌面分享给他人以实现桌面共享功能&#xff0c;这种功能在视频会议、在线教学等场景中很常见&#xff0c;这种功能如何实现呢&#xff1f;这节课我们就来解决这个问题…

python opencv怎么安装

1、安装python 注意&#xff1a;windows10 安装时强烈建议不用使用 Windows Store 安装。避免后期python运行时牵扯权限相关问题。 具体步骤&#xff1a; 1、前往python官网下载windows python 安装包 2、双击运行安装&#xff08;强力建议自定义安装&#xff0c;勾选pip&#…

【推荐】15k的star,5分钟本地化部署,一款由ChatGPT开发PDF文件处理神器,功能强大,你想要的都有。

【推荐】15k的star&#xff0c;5分钟本地化部署&#xff0c;一款由ChatGPT开发PDF文件处理神器&#xff0c;功能强大&#xff0c;你想要的都有。 文章目录 【推荐】15k的star&#xff0c;5分钟本地化部署&#xff0c;一款由ChatGPT开发PDF文件处理神器&#xff0c;功能强大&…