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

Java虚拟机在类加载阶段都做了些什么,才使得我们可以运行Java程序

前言:
今天和大家探讨一道Java中经典的面试题,这道面试题经常出现在各个公司的面试中,结合周志明,老师的《深入理解Java虚拟机》书籍,本篇文章主要讲解Java类加载机制的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。

如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~

小威在此先感谢各位小伙伴儿了😁

在这里插入图片描述

以下正文开始
在这里插入图片描述

文章目录

  • 类加载步骤
  • 加载
  • 验证
    • 文件格式验证
    • 元数据验证
    • 字节码验证
    • 符号引用验证
  • 准备
  • 解析
  • 初始化

类加载步骤

在Java的类加载过程中,加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和初始化(Initialization)是五个关键步骤。后续的使用和卸载这两个步骤就不做过多赘述啦,毕竟也不是面试中的重点。

在这里插入图片描述

加载

JVM在进行类加载的时候第一个阶段名字叫做加载。

加载阶段是通过类的全限定名来定位并加载对应的字节码数据。这个过程由类加载器完成的,别小看这小小的加载阶段,它也包含几个步骤,下面先着重介绍一些它:

首先它是通过类的全限定名查找字节码数据的来源的,可以是本地文件系统、网络、JAR包等。
其次它将字节码数据读入内存,并创建一个代表该类的Class对象。 在堆中为该类的静态变量分配内存空间。(注意是静态变量哦)

在这里插入图片描述

验证

正在向我们走来的是第二步,第二步骤会做些什么呢?在验证阶段,虚拟机会对被加载的类进行各种验证操作,以确保被加载的类的字节码符合Java虚拟机规范的要求,同时保证安全性。验证操作同样包括几个小步骤。

文件格式验证

在文件格式验证阶段中,Java虚拟机会验证字节码文件是否符合Class文件格式的规范。下面说一下这个详细过程:

首先是校验魔数,在Java的字节码文件中,前4个字节被叫做魔数(它的唯一作用就是确定这个文件是否是一个能被虚拟机接受的Class文件)检查字节码文件的前4个字节是否为固定的0xCAFEBABE。

第二就是校验版本号,也就是验证字节码文件的主版本号和次版本号是否在虚拟机所支持的范围内

第三是校验常量池:验证常量池中的各个常量是否符合规范。

在这里插入图片描述

元数据验证

在元数据验证阶段,虚拟机会检查类的字节码是否符合Java语言规范的语义要求

这里我们讨论下这个部分究竟是验证的神马:

  1. 验证是否所有的类都有父类:除了java.lang.Object外,其他类必须有一个直接父类
  2. 验证是否所有的非抽象类都实现了其声明的所有接口方法:确保类实现了它所声明的所有接口方法
  3. 验证是否所有的字段和方法符合访问权限约束:比如私有成员只能在本类内部访问
  4. 验证是否存在不兼容的方法重载:不允许出现两个或多个参数类型和返回值类型完全相同但方法名称不同的方法
    在这里插入图片描述

字节码验证

在字节码验证这个阶段,虚拟机会对字节码进行详细的验证,确保类的字节码操作符合Java虚拟机规范。在这个阶段它会进行这几个验证:

  • 操作数栈验证:每个字节码指令都有明确的操作数栈行为规定,虚拟机会检查操作数栈是否符合指令的要求
  • 局部变量表验证:虚拟机会检查字节码指令对局部变量表的读写是否正确。
  • 类型检查验证:虚拟机会验证字节码指令中的类型转换是否合法。

符号引用验证

在符号引用验证这个阶段,主要做的是:虚拟机会验证符号引用中的类、字段和方法是否存在、可访问等。比如:

  1. 类验证:验证被引用的类是否已经被加载,且满足访问权限的限制。
  2. 字段验证:验证被引用的字段是否存在,且满足访问权限的限制。
  3. 方法验证:验证被引用的方法是否存在,且满足访问权限和方法调用约束的限制。

在这里插入图片描述

准备

准备阶段是为类的静态变量分配内存空间,并设置默认初始值 (这里注意是静态变量,默认初始值哈 )。它的具体操作包括:

在方法区中为类的静态变量分配内存空间。 设置静态变量的默认初始值,例如数值类型为0,引用类型为null。

在这里插入图片描述

解析

解析阶段将常量池中的符号引用替换为直接引用。在Java虚拟机中,符号引用是一种编译时的引用,它与虚拟机实现无关。而直接引用是指直接指向内存位置的指针、句柄或偏移量等,可以被虚拟机直接使用。

解析操作包括哪些解析呢,请看下面:

  1. 类或接口的解析:将常量池中的类或接口符号引用解析为对应的直接引用。
  2. 字段解析:将常量池中的字段符号引用解析为对应的直接引用。
  3. 方法解析:将常量池中的方法符号引用解析为对应的直接引用。

在这里插入图片描述

初始化

初始化阶段是类加载过程的最后一步(除去使用和卸载哈~),这一步负责执行类的初始化操作,包括静态变量赋值和静态代码块的执行。初始化操作按顺序执行,并且只会执行一次

初始化操作包括这些:

  • 静态变量赋值:按照代码中的赋值操作,为类的静态变量赋初值
  • 静态代码块执行:执行类中的静态代码块,可以在其中进行复杂的初始化操作,例如读取配置文件、创建单例对象等

类的初始化是在首次主动使用该类时触发的,主动使用包括创建类的实例、访问类的静态变量或静态方法、调用类的反射方法等。

讲到这里,笔者终于肝完了,泪目!!!

在这里插入图片描述

文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。

在这里插入图片描述

相关文章:

Java虚拟机在类加载阶段都做了些什么,才使得我们可以运行Java程序

前言: 今天和大家探讨一道Java中经典的面试题,这道面试题经常出现在各个公司的面试中,结合周志明,老师的《深入理解Java虚拟机》书籍,本篇文章主要讲解Java类加载机制的知识。该专栏比较适合刚入坑Java的小白以及准备秋…...

华为认证 | 学HCIE,想培训需要注意啥?

HCIE(华为认证网络专家)是华为技术认证体系中的最高级别认证,对于网络工程师来说考试难度也比较高,一般来说,需要进行培训。 那么HCIE考试培训需要注意啥? 01 充分了解认证要求 在开始准备HCIE认证之前&a…...

这所211考数一英二,学硕降分33分,十分罕见!

一、学校及专业介绍 合肥工业大学(Hefei University of Technology),简称“合工大”,校本部位于安徽省合肥市,是中华人民共和国教育部直属的全国重点大学,是国家“双一流”建设高校, 国家“211工…...

关于BQ27427的配置问题

EVM是TI家做的BQ27427的开发板,这款芯片还挺新的。 大概是这样,一块开发板要一千多块钱,使用的时候还出现了一些奇怪的问题。 配置使用的是买的盗版的EV2400,就是黑色的那个东西,使用的通信方式IIC。 TI手册上写的软件…...

试卷还原成空白卷怎么做?分享个简单的方法

在进行考试时,可能会填错答案或想要重新测试,此时需要正确擦除填写的试卷答案。下面介绍一些需要注意的事项以及正确的擦除方法。 使用橡皮擦或橡皮 正确的擦除方法是使用橡皮擦或橡皮对填写的答案进行擦除。首先,将橡皮擦或橡皮放置在试卷上…...

查看学校名称中含北京的用户

查看学校名称中含北京的用户_牛客题霸_牛客网 1.like select device_id,age,university from user_profile where university like %北京%; 注意虽然按实际需求,北京一般是排在最前面,即北京%,但是严格意义上来说,搜索含有北京…...

快速开发人脸识别系统Java版本

简介: 先说下什么是人脸识别系统:举个例子,公司门口有个人脸识别系统,员工站到门口,看着摄像头,大屏幕上会抓拍到你的人脸,然后和公司的员工照片库里的照片比对,比对成功就提示&…...

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】

Reinforcement Learning with Code 【Code 1. Tabular Q-learning】 This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation o…...

解决:Uncaught (in promise) SyntaxError: “[object Object]“ is not valid JSON 问题的过程

1、问题描述: 其一、报错为: Uncaught (in promise) SyntaxError: "[object Object]" is not valid JSON 中文为: 未捕获(承诺中)语法错误:“[object Object]”不是有效的 JSON 其二、问题描…...

机器学习-New Optimization

机器学习(New Optimization) 前言: 学习资料 videopptblog 下面的PPT里面有一些符号错误,但是我还是按照PPT的内容编写公式,自己直到符号表示什么含义就好了 Notation 符号解释 θ t \theta_t θt​第 t 步时,模型的参数 Δ L …...

3d虚拟vr汽车实景展厅吸引更多潜在消费者

随着人们对生活品质的追求,越来越多的消费者开始关注汽车的外观设计、内饰配置等方面。传统的展示方式已经不能满足消费者的需求,车辆VR虚拟漫游展示应运而生。借助VR虚拟现实和web3d开发建模技术,对汽车的外观、造型及信息数据进行数字化处理…...

Java里的static import使用小结

Java里的static import使用小结 换了工作要把Java重新捡起来了,这个在大学里用过的语言,虽然不复杂,还是有一些奇怪的地方的。比如static Slgluimport。 Static import是JDK 1.5中引进的特性,不过读大学那会还真没注意到。它的作…...

go程序使用tcp短连接报:only one usage of each socket address

环境及现象 Win10上位机(C#,WPF)后台使用go作为服务。 连接情况 C#连接大概60个TCP长连接(设备)。 后台go服务连接60个UDP短连接(设备附属硬件), 10个TCP短连接(PLC,modbus通讯&a…...

十分钟配置好Neovim go开发环境(其他语言一样)

文章目录 前言仓库地址用法快捷键问题反馈 前言 这篇文章的目的是为了分享下我自己的Neovim配置。 本人是Golang程序员,最开始使用的IDE是JetBrains Goland。有一说一这个ide适配度很高,认识的很多人都使用这个。但是它也有几个对我来说的缺点&#xf…...

Linux第八章之进程概念

一、冯诺依曼体系结构 关于冯诺依曼,必须强调几点: 这里的存储器指的是内存不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)外设(输入或输出设备)要输入或者输出数据,也只能写入内存或…...

怎么学习Java并发编程相关技术? - 易智编译EaseEditing

学习Java并发编程可以通过多种方式进行,包括但不限于以下几种: 在线教程和学习平台: 网上有许多免费和付费的Java并发编程教程和学习平台,如Coursera、Udemy、edX、Codecademy等。这些平台提供结构化的课程和练习,适…...

vue3 +element动态表单实现

可以直接复制&#xff0c;接口看后端 父页面 <schedulesref"schedulesRef":dxbz"props.dxbz":jdlx"props.jdlx":woId"myWoId":addendumList"formInline.addendumList"v-if"addendumShow"addendum"addendu…...

Linux部署jar包,隐藏命令行参数

Linux部署jar包&#xff0c;隐藏命令行参数 一、背景需求二、查阅资料三、实现隐藏库3.1、测试test.c3.2、设置隐藏库3.3、验证 四、应用jar启动命令五、直接应用结果 最新项目安全检测&#xff0c;发现配置文件中数据库密码&#xff0c;redis密码仍处理明文状态 于是整理了一篇…...

JDBC-笔记

JDBC 1. JDBC介绍 JDBC&#xff08;Java Database Connectivity&#xff09;是一种用于连接和操作数据库的 Java API。 通过Java操作数据库的流程 第一步&#xff1a;编写Java代码 第二步&#xff1a;Java代码将SQL发送到MySQL服务端 第三步&#xff1a;MySQL服务端接收到SQ…...

Rust的入门篇(中)

Rust的入门篇(中) 这是接上面一篇rust入门篇(上)文章 22. 包管理一 mod nation {pub mod government {pub fn govern() {}}mod congress {pub fn legislate() {}}mod court {fn judicial() {super::congress::legislate();}} }fn main() {nation::government::govern(); }23.…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...