JVM 类加载过程笔记

一、概述

JVM(Java Virtual Machine)在运行 Java 程序时,需要将 .class 字节码文件加载到内存中,并转换成可以被 JVM 执行的数据结构,这一过程就是 类加载过程(Class Loading Process)

JVM 的类加载机制具备高度灵活性与可扩展性,支持自定义类加载器,且类的生命周期分为以下几个阶段:

二、类的生命周期阶段

  1. 加载(Loading)
  2. 验证(Verification)
  3. 准备(Preparation)
  4. 解析(Resolution)
  5. 初始化(Initialization)
  6. (可选)使用(Using)
  7. (可选)卸载(Unloading)

前五个阶段属于 类加载的过程,使用和卸载属于类的生命周期的后期阶段。


三、类加载的五个阶段详解

1. 加载(Loading)

作用:
.class 文件的字节码从磁盘或网络加载到 JVM 内存中,并生成一个 Class 对象。

步骤:

  • 通过类的全限定名查找 .class 文件。
  • 读取字节流。
  • 将字节流转换成内存中的数据结构。
  • 创建 java.lang.Class 类的实例。

说明:

  • 使用 类加载器(ClassLoader) 完成。
  • 可以自定义类加载器实现特殊的加载逻辑。

2. 验证(Verification)

作用:
确保字节码文件的正确性与安全性,不会破坏 JVM 的稳定性。

主要检查:

  • 文件格式验证(魔数、版本号等)
  • 元数据验证(类结构正确性)
  • 字节码验证(操作码合法性、栈操作正确性)
  • 符号引用验证(类和方法是否存在)

3. 准备(Preparation)

作用:
为类的 静态变量 分配内存,并初始化默认值(不包括静态代码块和显式赋值)。

特点:

  • 所有静态变量初始化为零值(数值为0,对象为null,boolean为false)。
  • 不执行任何 Java 代码。
  • 这一步只是内存分配与默认值初始化。

示例:

public class Demo {static int a = 10;
}

在准备阶段,a 的值是 0,真正赋值为 10 的过程发生在 初始化阶段


4. 解析(Resolution)

作用:
将常量池中的 符号引用 转换为 直接引用

解析内容:

  • 类或接口的符号引用 → 直接引用
  • 字段符号引用 → 直接引用
  • 方法符号引用 → 直接引用
  • 接口方法引用 → 直接引用

说明:

  • 并非必须立即解析,可在运行时动态解析(延迟解析)。
  • 也可由 JVM 实现决定是否在加载时解析。

5. 初始化(Initialization)

作用:
执行类构造器 <clinit>() 方法,对静态变量进行显式赋值和执行静态代码块。

执行条件:

  • 创建类的实例
  • 访问类的静态变量或静态方法
  • 反射调用 Class.forName()
  • 初始化类的子类时,其父类会被先初始化
  • JVM 启动时指定的主类(含 main 方法)

注意:

  • 每个类只会初始化一次。
  • 父类先于子类初始化。

四、类加载器(ClassLoader)

类加载器的类型

名称说明
Bootstrap ClassLoader(启动类加载器)加载 java.* 核心类库(由 C++ 实现,非 Java 类)
Extension ClassLoader(扩展类加载器)加载 ext 目录下的类(如 jre/lib/ext
Application ClassLoader(系统类加载器)加载应用类路径(classpath)下的类
自定义类加载器用户可以继承 ClassLoader 实现自己的加载逻辑

双亲委派模型(Parent Delegation Model)

工作流程:

  1. 当前类加载器收到加载请求。
  2. 委派给父类加载器。
  3. 父类加载器继续向上委托,直到 Bootstrap ClassLoader。
  4. 若父加载器无法加载,再由当前加载器尝试加载。

优点:

  • 避免类的重复加载。
  • 保证核心类安全性(如 java.lang.String 永远由启动类加载器加载)。

五、类的卸载(Unloading)

条件:

  • 该类的 Class 对象没有任何引用。
  • 加载该类的类加载器没有任何引用。
  • JVM 才能卸载该类。

说明:

  • 卸载的前提是类加载器无引用,通常发生在动态部署的模块或插件系统中。
  • 主动卸载需要结合自定义类加载器。

六、类加载过程图解

              ┌────────────┐│ .class 文件 │└────┬───────┘↓┌────────────┐│ 加载 Loading│└────┬───────┘↓┌───────────────────┐│ 验证 Verification │└────┬──────────────┘↓┌────────────────┐│ 准备 Preparation│└────┬───────────┘↓┌──────────────┐│ 解析 Resolution│└────┬─────────┘↓┌─────────────────────┐│ 初始化 Initialization│└─────────────────────┘

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于爬虫技术的电影数据可视化系统 Python+Django+Vue.js

本文项目编号 25002 &#xff0c;文末自助获取源码 \color{red}{25002&#xff0c;文末自助获取源码} 25002&#xff0c;文末自助获取源码 目录 一、系统介绍二、系统录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状 六、核心代码6.1 查询数据6.2 新…

如何用 LUKS 和 cryptsetup 为 Linux 配置加密

在信息安全愈发重要的今天&#xff0c;为 Linux 系统盘配置全盘加密已经成为很多企业和个人的选择。LUKS&#xff08;Linux Unified Key Setup&#xff09;配合工具 cryptsetup 可以在不牺牲性能的前提下实现高强度加密。本文将通过一个故事化的场景&#xff0c;介绍整个配置过…

VIVADO技巧_BUFGMUX时序优化

1.版本说明日期作者版本说明2025xxxx风释雪初始版本 2.概述 基于VIVADO时序约束&#xff0c;BUFGMUX多路时钟选择原语的设计3.原语介绍 7系列FPGA/UltraSCale/UltraSCaleBUFGMUX_CTRL BUFGMUX_CTRL_inst (.O(O), // 1-bit output: Clock output.I0(I0), // 1-bit input: Cloc…

服务器系统时间不准确怎么办?

服务器系统时间不准确可能会导致日志错乱、任务调度失败、SSL证书校验错误等问题。以下是解决办法&#xff1a;&#x1f310; 一、同步系统时间的方法1. 使用 timedatectl 命令&#xff08;适用于 systemd 系统&#xff09;timedatectl set-ntp true # 开启自动同步 timedatect…

零信任产品联合宁盾泛终端网络准入,打造随需而变、精准贴合业务的网络安全访问体系

零信任网络访问控制&#xff08;Zero Trust Network Access&#xff0c;ZTNA&#xff0c;文中零信任皆指 ZTNA&#xff09;基于“永不信任&#xff0c;持续验证”的理念&#xff0c;打破了企业基于传统网络边界进行防护的固有模式。在当前日趋复杂的网络环境下&#xff0c;内部…

【未限制消息消费导致数据库CPU告警问题排查及解决方案】

一、背景 某天下午&#xff0c;上游系统同一时间突然下了三个大合同数据&#xff0c;平均每个合同数据实例在6万以上的量级&#xff0c;短短几分钟内瞬间有20万左右的流量涌入系统。 而在正常情况下&#xff0c;系统1天处理的流量也不过2千量级&#xff0c;当时数据库指标监控告…

iOS开发 Swift 速记2:三种集合类型 Array Set Dictionary

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

Apache基础配置

一、Apache安装# 安装apache [rootwebserver ~]# yum install httpd -y# 在防火墙中放行web服务 [rootwebserver ~]# firewall-cmd --permanent --add-servicehttp success [rootwebserver ~]# firewall-cmd --permanent --add-servicehttps success# 开启服务 [rootwebserver …

Python100个库分享第37个—BeautifulSoup(爬虫篇)

目录专栏导读&#x1f4da; 库简介&#x1f3af; 主要特点&#x1f6e0;️ 安装方法&#x1f680; 快速入门基本使用流程解析器选择&#x1f50d; 核心功能详解1. 基本查找方法find() 和 find_all()CSS选择器2. 属性操作3. 文本提取&#x1f577;️ 实战爬虫案例案例1&#xff…

石子入水波纹效果:顶点扰动着色器实现

水面波纹的真实模拟是计算机图形学中一个经典且重要的课题,广泛应用于游戏、影视和虚拟现实等领域。本文将从技术原理和实现细节出发,系统介绍如何利用**顶点扰动(Vertex Displacement)**技术,结合多种辅助方法,打造既真实又高效的水面波纹效果。 一、顶点扰动的核心思想…

【FFmpeg 快速入门】本地播放器 项目

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 整体架构 详细流程 &#x1f4c1; 数据流向​ &#x1f4c1; 队列设计​编辑 &#x1f4c1; 线程设计 &#x1f4c1; 音视频同步 &#x1f4c1; 音频输出设计 &#x1f4c1; 视频输出设计 &#x1f4c1; 总结 …

Maven dependencyManagement标签 properties标签

dependencyManagement标签properties标签

前端埋坑之element Ui 组件el-progress display:flex后不显示进度条解决方案

项目适用场景&#xff1a; <divs style"display&#xff1a;flex"> <span>这里是进度条前标题说明</span> <el-progress :percentage"50"></el-progress> </div> 问题呈现&#xff1a; el-progress进度条没啦&#xf…

嵌入式学习-土堆PyTorch(7)-day23

损失函数的调用import torch from torch import nn from torch.nn import L1Lossinputs torch.tensor([1.0,2.0,3.0]) target torch.tensor([1.0,2.0,5.0])inputs torch.reshape(inputs, (1, 1, 1, 3)) target torch.reshape(target, (1, 1, 1, 3)) #损失函数 loss L1Loss…

【2025最新】使用neo4j实现GraphRAG所需的向量检索

学习笔记&#xff0c;比较混乱&#xff0c;介意慎点。 背景 在将UMLS或者LightRAG构造的数据库存入neo4j之后&#xff0c;我开始将知识图谱运用到实际场景的使用中、例如查询、推理。然而&#xff0c;由于字符串匹配导致大量术语在检索时出现缺失。导致检索效果不佳。我们需要…

【AI深究】随机森林(Random Forest)全网最详细全流程详解与案例(附Python代码演示)|集成学习|数学原理、案例流程、代码演示及结果解读|参数与调优、工程启示、单棵决策树的对比、优缺点

大家好&#xff0c;我是爱酱。本篇将会系统地讲解随机森林&#xff08;Random Forest&#xff09;的原理、核心思想、数学表达、算法流程、代码实现与工程应用。内容适合初学者和进阶读者&#xff0c;配合公式和可视化示例。 注&#xff1a;本文章含大量数学算式、详细例子说明…

6.String、StringBuffer、StringBuilder区别及使用场景

String固定长度&#xff0c;引用的字符串内容无法改变例如&#xff0c;String s abc;s def;那么 s 字符串对应的地址已经改变了StringBuider 声明一个对象时&#xff0c;指向堆中的一块空间&#xff0c;包括两个属性 value 和 count其中 value 属性类似动态数组&#xff0c;可…

Qualcomm Linux 蓝牙指南学习--验证 Fluoride 协议栈的功能(2)

前言 Qualcomm Technologies推出的Linux蓝牙指南详细介绍了基于Qualcomm RB3 Gen 2和IQ-9100 Beta开发套件的蓝牙解决方案。该文档涵盖BlueZ和Fluoride协议栈的功能验证流程,支持蓝牙5.2核心规范,包括WCN6750/WCN6856/QCA6698AQ芯片组的特性。主要内容分为三部分: ‌1. 功…

Spring Boot中REST与gRPC并存架构设计与性能优化实践指南

Spring Boot中REST与gRPC并存架构设计与性能优化实践指南 在微服务架构日益复杂的当下&#xff0c;单一协议往往难以满足高并发低延迟与生态兼容的双重需求。本文基于真实生产环境的项目经验&#xff0c;分享了如何在Spring Boot中同时提供RESTful API和gRPC接口的架构设计、性…