JVM 类加载子系统在干什么?

news2025/2/11 22:15:01

JVM 类加载子系统是什么?

类加载子系统(Class Loader Subsystem)是 JVM 负责 加载、链接和初始化 .class 文件的组件。它的主要作用是将字节码文件加载进 JVM 并准备执行

类加载器(ClassLoader)是 字节码的搬运工,负责 找到、加载、解析和初始化字节码,最终让 JVM 执行它。

类加载子系统 = 类加载器 + 其他步骤

类加载子系统主要包括三个阶段:

  1. 加载(Loading)由类加载器完成,找到 .class 文件并加载到方法区。
  2. 链接(Linking) → 验证(检查字节码)、准备(分配静态变量)、解析(符号引用替换)。
  3. 初始化(Initialization) → 执行 static 代码块和静态变量赋值。

1. 为什么需要类加载子系统?

当你写一个 Java 类,比如:

public class Demo {
    public static void main(String[] args) {
        System.out.println("Hello JVM!");
    }
}

编译后会生成一个 Demo.class 文件,这个文件并不能直接运行,而是需要 JVM 加载 进内存,解析并执行,这就是 类加载子系统的作用


2. 类加载子系统的主要任务

类加载子系统的作用主要包括:

  1. 加载(Loading):将 .class 文件从磁盘/网络/其他来源加载进 JVM
  2. 链接(Linking)
    • 验证(Verification):检查 class 字节码是否合法(避免恶意代码)。
    • 准备(Preparation):为静态变量分配内存,赋默认值。
    • 解析(Resolution):将符号引用替换为直接引用(将 String.class 转换为内存地址)。
  3. 初始化(Initialization):执行类的 static 代码块和 static 变量初始化代码。

3. 类加载过程(深入细节)

(1) 加载(Loading)

JVM 通过 类加载器(ClassLoader).class 文件加载到内存,类信息存放在 方法区
来源

  • 磁盘(如 C:\classes\Demo.class
  • 网络(如 http://example.com/Demo.class
  • 运行时生成(如动态代理 Proxy

示例:

Class<?> clazz = Class.forName("com.example.Demo");

这个调用会触发 Demo.class 加载


(2) 连接(Linking)

加载完成后,JVM 需要确保类的正确性,并为其分配必要的内存

(a) 验证(Verification)
检查 .class 文件是否符合 JVM 规范,防止字节码攻击。

(b) 准备(Preparation)
静态变量 分配内存并初始化默认值(不执行赋值语句)。

public class Test {
    static int a = 10;
}
  • 准备阶段a = 0 (默认值)
  • 初始化阶段a = 10(执行赋值)

(c) 解析(Resolution)
符号引用java/lang/String)转换成 直接引用(指向方法区 String.class 的地址)。


(3) 初始化(Initialization)

真正执行 static 代码块 和 static 变量赋值

public class Test {
    static int a = 10;
    static {
        System.out.println("Class initialized");
    }
}
  • 赋值 a = 10
  • 执行 static 代码块,打印 "Class initialized"

类初始化的时机 只有第一次使用该类(创建对象、访问静态变量等)时,才会初始化:

Test t = new Test(); // 触发初始化

4. 类加载器(ClassLoader)

JVM 提供不同层次的类加载器:

  1. Bootstrap ClassLoader(启动类加载器)
    • 加载核心类库rt.jar
    • 例:java.lang.String
  2. Extension ClassLoader(扩展类加载器)
    • 加载 lib/ext 目录下的类
    • 例:javax.crypto.Cipher
  3. Application ClassLoader(应用类加载器)
    • 加载 classpath 下的应用代码
    • 例:com.example.Demo
  4. 自定义 ClassLoader
    • 通过 URLClassLoaderdefineClass 自定义类加载逻辑。

示例:

ClassLoader classLoader = Test.class.getClassLoader();
System.out.println(classLoader); // AppClassLoader

5. 结论

  • 类加载子系统 负责 .class 文件加载到 JVM,并执行必要的初始化操作。
  • 类加载有 加载(Loading)、链接(Linking)和初始化(Initialization) 三个阶段。
  • 类加载器 负责查找并加载 .class 文件,JVM 默认有 启动类加载器、扩展类加载器、应用类加载器,也可以自定义类加载器

总结一句话

类加载子系统是 JVM 的入口,负责加载、校验和初始化类,使其能够被 JVM 运行。

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

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

相关文章

Redis数据库(二):Redis 常用的五种数据结构

Redis 能够做到高性能的原因主要有两个&#xff0c;一是它本身是内存型数据库&#xff0c;二是采用了多种适用于不同场景的底层数据结构。 Redis 常用的数据结构支持字符串、列表、哈希表、集合和有序集合。实现这些数据结构的底层数据结构有 6 种&#xff0c;分别是简单动态字…

网络安全溯源 思路 网络安全原理

网络安全背景 网络就是实现不同主机之间的通讯。网络出现之初利用TCP/IP协议簇的相关协议概念&#xff0c;已经满足了互连两台主机之间可以进行通讯的目的&#xff0c;虽然看似简简单单几句话&#xff0c;就描述了网络概念与网络出现的目的&#xff0c;但是为了真正实现两台主机…

BS架构(笔记整理)

楔子.基本概念 1.在网络架构中&#xff1a; 服务器通常是集中式计算资源&#xff0c;负责处理和存储数据&#xff1b;客户机是请求这些服务的终端设备&#xff0c;可能是个人电脑或移动设备&#xff1b;浏览器则是客户机上用来与服务器交互的工具&#xff0c;负责展示网页内容…

06排序 + 查找(D2_查找(D2_刷题练习))

目录 1. 二分查找-I 1.1 题目描述 1.2 解题思路 方法&#xff1a;二分法&#xff08;推荐使用&#xff09; 2. 二维数组中的查找 2.1 题目描述 2.2 解题思路 方法一&#xff1a;二分查找&#xff08;推荐使用&#xff09; 3. 寻找峰值 3.1 题目描述 3.2 解题思路 方…

C++ 设计模式 - 访问者模式

一&#xff1a;概述 访问者模式将作用于对象层次结构的操作封装为一个对象&#xff0c;并使其能够在不修改对象层次结构的情况下定义新的操作。 《设计模式&#xff1a;可复用面向对象软件的基础》一书中的访问者模式因两个原因而具有传奇色彩&#xff1a;一是因为它的复杂性&a…

海云安开发者智能助手(D10)全面接入DeepSeek,赋能开发者安全高效编码新范式

海云安正式宣布完成与DeepSeek&#xff08;深度求索&#xff09;的深度技术融合&#xff0c;旗下核心产品D10开发者智能助手全面接入DeepSeek R1模型。此次合作标志着海云安在"AI驱动开发安全"领域实现重要突破。数据显示&#xff0c;通过DeepSeek R1模型的优化与蒸馏…

分布式id探索

一、为什么要使用分布式id&#xff1f; 随着数据量增加&#xff0c;数据需要进行水平拆分&#xff0c;但表自增id无法满足唯一性&#xff1b; 二、分布式id的特点 1唯一性 2 趋势递增、单调递增&#xff08;数据库中存放的数据结构数据从小到大有序排列&#xff09;&#xff0…

【Linux系统】—— 简易进度条的实现

【Linux系统】—— 简易进度条的实现 1 回车和换行2 缓冲区3 进度条的准备代码4 第一版进度条5 第二版进度条 1 回车和换行 先问大家一个问题&#xff1a;回车换行是什么&#xff0c;或者说回车和换行是同一个概念吗&#xff1f;   可能大家对回车换行有一定的误解&#xff0…

一文学会:用DeepSeek R1/V3 + AnythingLLM + Ollama 打造本地化部署的个人/企业知识库,无须担心数据上传云端的泄露问题

文章目录 前言一、AnythingLLM 简介&基础应用1.主要特性2.下载与安装3.配置 LLM 提供商4.AnythingLLM 工作区&对话 二、AnythingLLM 进阶应用&#xff1a;知识增强使用三、AnythingLLM 的 API 访问四、小结1.聊天模式2.本地存储&向量数据库 前言 如果你不知道Olla…

开源身份和访问管理方案之keycloak(一)快速入门

文章目录 什么是IAM什么是keycloakKeycloak 的功能 核心概念client管理 OpenID Connect 客户端 Client Scoperealm roleAssigning role mappings分配角色映射Using default roles使用默认角色Role scope mappings角色范围映射 UsersGroupssessionsEventsKeycloak Policy创建策略…

C++STL(六)——list模拟

目录 本次所需实现的三个类一、结点类的模拟实现构造函数 二、迭代器类的模拟实现为什么有迭代器类迭代器类的模板参数说明构造函数运算符的重载- -运算符的重载和!运算符的重载*运算符的重载->运算符的重载引入模板第二个和第三个参数 三、list的模拟实现3.1 默认成员函数构…

HTML5--网页前端编程(下)

HTML5–网页前端编程(下) 9.常用标签下 (1)表格标签 用来展示数据,显示数据,规整条理,可读性好 基本语法 <table><tr> <td>单元格内的文字</td> <td>单元格内的文字</td>… </tr> <tr> <td>单元格内的文字&l…

Git 分布式版本控制工具使用教程

1.关于Git 1.1 什么是Git Git是一款免费、开源的分布式版本控制工具&#xff0c;由Linux创始人Linus Torvalds于2005年开发。它被设计用来处理从很小到非常大的项目&#xff0c;速度和效率都非常高。Git允许多个开发者几乎同时处理同一个项目而不会互相干扰&#xff0c;并且在…

linux部署ollama+deepseek+dify

Ollama 下载源码 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz sudo tar -C /usr -xzf ollama-linux-amd64.tgz启动 export OLLAMA_HOST0.0.0.0:11434 ollama serve访问ip:11434看到即成功 Ollama is running 手动安装deepseek…

torch_bmm验算及代码测试

文章目录 1. torch_bmm2. pytorch源码 1. torch_bmm torch.bmm的作用是基于batch_size的矩阵乘法,torch.bmm的作用是对应batch位置的矩阵相乘&#xff0c;比如&#xff0c; mat1的第1个位置和mat2的第1个位置进行矩阵相乘得到mat3的第1个位置mat1的第2个位置和mat2的第2个位置…

CTFHub-RCE系列wp

目录标题 引言什么是RCE漏洞 eval执行文件包含文件包含php://input读取源代码远程包含 命令注入无过滤过滤cat过滤空格过滤目录分隔符过滤运算符综合过滤练习 引言 题目共有如下类型 什么是RCE漏洞 RCE漏洞&#xff0c;全称是Remote Code Execution漏洞&#xff0c;翻译成中文…

从大规模恶意攻击 DeepSeek 事件看 AI 创新隐忧:安全可观测体系建设刻不容缓

作者&#xff1a;羿莉&#xff08;萧羿&#xff09; 全球出圈的中国大模型 DeepSeek 作为一款革命性的大型语言模型&#xff0c;以其卓越的自然语言处理能力和创新性成本控制引领行业前沿。该模型不仅在性能上媲美 OpenAI-o1&#xff0c;而且在推理模型的成本优化上实现了突破…

【学习笔记】企业数字化转型顶层设计与企业架构TOGAF9.2-第0章 导论

数据要素资产化迈入关键发展期 围绕发挥数据要素乘数作用&#xff0c;研究实施“数据要素x”行动:从供需两端发力&#xff0c;在智能制造、商贸流通、交通物流、金融服务、医疗健康等若干重点领域&#xff0c;加强场景需求牵引&#xff0c;打通流通障碍、提升供给质量&#xf…

SpringCloud - Sentinel服务保护

前言 该博客为Sentinel学习笔记&#xff0c;主要目的是为了帮助后期快速复习使用 学习视频&#xff1a;7小快速通关SpringCloud 辅助文档&#xff1a;SpringCloud快速通关 源码地址&#xff1a;cloud-demo 一、简介 官网&#xff1a;https://sentinelguard.io/zh-cn/index.h…

单片机上SPI和IIC的区别

SPI&#xff08;Serial Peripheral Interface&#xff09;和IC&#xff08;Inter-Integrated Circuit&#xff09;是两种常用的嵌入式外设通信协议&#xff0c;它们各有优缺点&#xff0c;适用于不同的场景。以下是它们的详细对比&#xff1a; — 1. 基本概念 SPI&#xff0…