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

【JVM】类加载机制

文章目录

  • 类加载机制
  • 类加载过程
    • 1. 加载
    • 2. 验证
    • 3. 准备
    • 4. 解析
      • 偏移量
      • 符号引用和直接引用
    • 5. 初始化

类加载机制

类加载指的是,Java 进程运行的时候,需要把 .class 文件从硬盘读取到内存,并进行一些列的校验解析的过程(程序要想执行,就得进入内存)

  • .class 文件==>类对象
  • 硬盘==>内存

类加载过程

类加载的过程,其实是在 Java 官方文档中给出的说明

  1. 加载:找到. class 文件,并且读文件内容
  2. 验证:校验 .class 文件的格式是否符合 JVM 规范要求
  3. 准备:给类对象分配内存(此时内存空间全是 0 的==>类的静态成员也就是全 0 的值)
  4. 解析:针对类中的字符串常量进行处理
  5. 把类对象的各个属性进行赋值填充==>触发对父类的加载,初始化静态成员,执行静态代码块

类加载大体的过程可以分为五 个步骤(也有资料上说是三个,这个情况就是把 2,3,4 合并成一个了)

1. 加载

把硬盘上的 .class 文件找到,打开文件,读取到文件内容(认为读到的是二进制的数据)

  • 找文件这里还有点幺蛾子(后面再说)

2. 验证

当前需要确保读到的文件的内容是合法的 .class 文件(字节码文件)格式

具体的验证依据,在 Java 虚拟机规范中,有明确的格式说明:
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html


image.png|464
这里的描述方式,类似与 C语言的结构体

  • 前面一列是属性的类型;后面一列是属性的名字
  • u4 就是 4 个字节的无符号整数
  1. magic

magic 也叫做 magic number,魔幻数字。广泛应用于二进制文件格式中,用来标识当前二进制文件的格式是哪种类型

二进制文件是一个非常广泛的话题。mp3mp4 是二进制,你图片也是二进制,你一个可执行程序也是二进制,你一个 .class 文件也是二进制。不同的二进制,在使用和解析的时候肯定是存在一些差别的

所以我们一般就会在二进制文件开头指定一个固定的“魔幻数字”,通过这个数字对这个文件类型进行区分

  1. minor/major_version
  • minor_version:次版本
  • major_version:主版本

平时说 Java 8,9,17… 平时表达的时候使用的版本,实际上 JVM 开发过程中内部还有版本(通过 minor/major_version 进行表示)

JVM 执行 .class 文件对的时候,就会验证版本是否符合要求。如果版本不兼容,就无法执行。一般来说,高版本的 JVM 可以运行低版本的 .class,反之不一定能行

3. 准备

给类对象申请内存空间

此时申请到的内存空间,里面的默认值,都是全 0 的。(这个阶段中,类对象里的静态成员变量的值也就相当于是 0)

4. 解析

主要是针对类中的字符串常量进行处理

解析阶段是 Java 虚拟机将常量池的符号引用替换为直接引用的过程,也就是初始化常量的过程

偏移量

class Test {private String s = "hello";
}

image.png|387

  • .class 文件中,会有一个部分用来存储“hello”这个字符串常量(常量池里面,上面验证的格式里面包含了)
  • 还有一个空间对应着 s 这个变量
    • 在上述代码中,我们很明显的知道,s 变量里面相当于保存了“hello”字符串常量的地址。但是在文件中,不存在“地址”这样的概念。谈到地址就是“内存”的地址,我们是文件,是硬盘(硬盘没有地址的概念)
    • 虽然没有地址,但是可以存储一个类似于地址的“偏移量”(文件开头到“hello”的距离)这样的概念,用来描述这个数据的位置

符号引用和直接引用

此处文件中填充给 s 的“hello”的偏移量,就可以认为是“符号引用”。接下来要把 .class 文件加载到内存中,就会先把“hello”这个字符串加载到内存中,此时“hello”就有地址了。

之后 s 里面的值就可以替换成当前“hello真实的地址了(直接引用

本来在文件中存储的并非是一个真实的地址,而是一个标记(偏移量);我们回到内存中后,我们就可以把这个数据的存储换成真实的地址了

5. 初始化

针对类对象完成后续的初始化
还要执行静态代码块的逻辑,还可能会触发父类的加载

相关文章:

【JVM】类加载机制

文章目录 类加载机制类加载过程1. 加载2. 验证3. 准备4. 解析偏移量符号引用和直接引用 5. 初始化 类加载机制 类加载指的是,Java 进程运行的时候,需要把 .class 文件从硬盘读取到内存,并进行一些列的校验解析的过程(程序要想执行…...

ENV | 5步安装 npm node(homebrew 简洁版)

1. 操作步骤 1.1 安装 homebrew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"1.2 安装 node # 安装最新版 brew install node # 安装指定版本,如18 brew install node181.3 安装 nvm&#xff08…...

EasyExcel全面实战:掌握多样化的Excel导出能力

1 概述 本文将通过实战案例全面介绍EasyExcel在Excel导出方面的多种功能。内容涵盖多表头写入、自定义格式、动态表头生成、单元格合并应用等。通过这些实例,读者可以掌握EasyExcel的各种高级功能,并在实际项目中灵活应用。 白日依山尽,黄河入海流。 欲穷千里目,更上一层楼…...

基于springcloud的药品销售系统

文未可获取一份本项目的java源码和数据库参考。 一、选题背景与意义 1. 选题背景 在日常医药管理中,面对众多的药品和众多不同需求的顾客,每天都会产生大量的数据信息。以传统的手工方式来处理这些信息,操作比较繁琐,且效率低下…...

基于组网分割的超大规模设计 FPGA 原型验证解决方案

引言 如何快速便捷的完成巨型原型验证系统的组网,并监测系统的连通性及稳定性? 如何将用户设计快速布局映射到参与组网的原型验证系统的每一块 FPGA? 随着用户设计规模的日益增大,传统基于单片 FPGA 或单块电路板的原型验证系统…...

C# 面向对象基础,简单的银行存钱取钱程序

题目: 代码实现: BankAccount部分: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Bank {internal class BankAccount{private decimal balance 0;//账…...

【Rockchip系列】官方函数:drm_buf_alloc

drm_buf_alloc 函数 功能 分配一个DRM(Direct Rendering Manager)缓冲区。 语法 void* drm_buf_alloc(int width, int height, int bpp, int* fd, int* handle, size_t* size, int flags);参数 width: 缓冲区宽度(像素)heigh…...

深度学习--------------------------------门控循环单元GRU

目录 门候选隐状态隐状态门控循环单元GRU从零开始实现代码初始化模型参数定义隐藏状态的初始化函数定义门控循环单元模型训练该部分总代码简洁代码实现 做RNN的时候处理不了太长的序列,这是因为把整个序列信息全部放在隐藏状态里面,当时间很长的话&#…...

【实战】| X小程序任意用户登录

复现步骤 在登陆时,弹出这个页面时 抓包,观察数据包的内容 会发现有mobile值(密文)和iv值(随机数),拿到密文,肯定时想到解密,想要解密就必须知道密文,…...

计算机毕业设计之:云中e百货微信小程序设计与实现(源码+文档+定制)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...

CEX上币趋势分析:Infra赛道与Ton生态的未来

在当前的加密市场中,CEX(中心化交易所)上币的选择愈发重要,尤其是对项目方而言。根据 FMG 的整理,结合「杀破狼」的交易所上币信息,显然 Infra 赛道成为了交易所的热门选择,而 Ton 生态也展现出…...

数组基础(c++)

第1题 精挑细选 时限:1s 空间:256m 小王是公司的仓库管理员,一天,他接到了这样一个任务:从仓库中找出一根钢管。这听起来不算什么,但是这根钢管的要求可真是让他犯难了,要求如下&#x…...

第十三届蓝桥杯真题Python c组A.排列字母(持续更新)

博客主页:音符犹如代码系列专栏:蓝桥杯关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 【问题描述】 小蓝要把一个字符串中的字母按其在字母表中的顺序排列。 例如&a…...

IDEA自动清理类中未使用的import包

目录 1.建议清理包的理由 2.清理未使用包的方式 2.1 手动快捷键清理 2.2 设置自动清理 1.建议清理包的理由 有时候项目类文件中会有很多包被引入了,但是并没有被使用,这会增加项目的编译时间并且代码可读性也会变差。在开发过程中,建议设…...

加工零件C++

题目: 样例解释: 样例#1: 编号为 1 的工人想生产第 1 阶段的零件,需要编号为 2 的工人提供原材料。 编号为 2 的工人想生产第 1 阶段的零件,需要编号为 1 和 3 的工人提供原材料。 编号为 3 的工人想生产第 1 阶段的零件&#x…...

Etcd 是一个分布式的键值存储系统,用于共享配置和服务发现

Etcd 是一个分布式的键值存储系统,用于共享配置和服务发现。它最初由 CoreOS 开发,并已成为许多分布式系统中的关键组件之一,特别是在 Kubernetes 中扮演着核心角色。Etcd 的设计目标是简单、可靠、安全,并且易于使用。 Etcd 的特…...

如何帮助我们改造升级原有架构——基于TDengine 平台

一、简介 TDengine 核心是一款高性能、集群开源、云原生的时序数据库(Time Series Database,TSDB),专为物联网IoT平台、工业互联网、电力、IT 运维等场景设计并优化,具有极强的弹性伸缩能力。同时它还带有内建的缓存、…...

MySQl查询分析工具 EXPLAIN ANALYZE

文章目录 EXPLAIN ANALYZE是什么Iterator 输出内容解读EXPLAIN ANALYZE和EXPLAIN FORMATTREE的区别单个 Iterator 内容解读 案例分析案例1 文件排序案例2 简单的JOIN查询 参考资料:https://hackmysql.com/book-2/ EXPLAIN ANALYZE是什么 EXPLAIN ANALYZE是MySQL8.…...

RestClientException异常

什么情况下会抛出RestClientException异常 RestClientException 异常通常在使用 Spring 的 RestTemplate 进行 RESTful API 调用时抛出。以下是一些常见的情况: 网络问题:当无法连接到目标服务器时,例如网络中断或服务器不可达。 HTTP 状态…...

poi如何实现自定义导出Excel-纵向横向合并单元格,自定义填充数据列

前情提要 首先需要明确自己需要导出的excel构成是如何的,比如我需要导出一个自定义表头的excel表格,第一行A到X是标题需要横向合并单元格,第二行和第三行是表头,A到J需要第二行和第三行纵向合并单元格,K到N的第二行需…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) ​遍历字符串​:通过外层循环逐一检查每个字符。​遇到 ? 时处理​: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: ​与…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...