当前位置: 首页 > 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.…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...