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

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

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 运行。

相关文章:

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

JVM 类加载子系统是什么&#xff1f; 类加载子系统&#xff08;Class Loader Subsystem&#xff09;是 JVM 负责 加载、链接和初始化 .class 文件的组件。它的主要作用是将字节码文件加载进 JVM 并准备执行。 类加载器&#xff08;ClassLoader&#xff09;是 字节码的搬运工&…...

Golang轻松实现消息模板变量替换:text/template

text/template 是 Go 语言标准库中的一个包&#xff0c;用于生成文本输出。它通过解析模板并根据给定的数据执行模板来生成最终的文本。text/template 提供了强大的模板引擎&#xff0c;支持条件判断、循环、变量替换等功能。 基本概念 模板&#xff1a;模板是一个文本文件或…...

DeepSeek模型R1服务器繁忙,怎么解决?

在当今科技飞速发展的时代&#xff0c;人工智能领域不断涌现出令人瞩目的创新成果&#xff0c;其中DeepSeek模型无疑成为了众多关注焦点。它凭借着先进的技术和卓越的性能&#xff0c;在行业内掀起了一股热潮&#xff0c;吸引了无数目光。然而&#xff0c;如同许多前沿技术在发…...

《探秘Windows 10驱动开发:从入门到实战》

《探秘Windows 10驱动开发:从入门到实战》 为什么要在 Windows 10 编写驱动程序 在当今数字化时代,计算机已成为人们生活和工作中不可或缺的工具 ,而 Windows 10 作为一款广泛使用的操作系统,其生态系统的丰富性和复杂性不言而喻。在这个庞大的体系中,驱动程序扮演着举足…...

Golang的容器化部署流程

# Golang的容器化部署流程 什么是容器化部署 容器化部署是将应用程序、运行环境及其依赖项打包在一起&#xff0c;以便可以在任何环境中快速、一致地运行的技术。它提供了更高效的资源利用、更便捷的部署和更稳定的环境。 的容器化支持 天生支持跨平台编译&#xff0c;使得将Go…...

计算机网络,大白话

好嘞&#xff0c;咱就从头到尾&#xff0c;给你好好说道说道计算机网络里这些“门门道道”的概念&#xff1a; 1. 网络&#xff08;Network&#xff09; 啥是网络&#xff1f; 你可以把网络想象成一个“大Party”&#xff0c;大家&#xff08;设备&#xff09;聚在一起&#…...

智慧城市V4系统小程序源码独立版全插件全开源

智慧城市V4系统小程序源码&#xff1a;多城市代理同城信息服务的全域解决方案 在数字化浪潮的推动下&#xff0c;智慧城市已成为全球发展的核心战略。作为这一领域的革新者&#xff0c;智慧城市V4系统小程序源码凭借其多城市代理同城信息服务能力与多商家营销功能&#xff0c;…...

SpringBoot分布式应用程序和数据库在物理位置分配上、路由上和数量上的最佳实践是什么?

在设计和部署Spring Boot分布式应用程序时&#xff0c;物理位置分配、路由和数据库数量的最佳实践对系统性能、可用性和可维护性至关重要。以下是相关建议&#xff1a; 1. 物理位置分配 最佳实践&#xff1a; 靠近用户部署&#xff1a;将应用实例部署在靠近用户的数据中心&a…...

【LeetCode Hot100 哈希】两数之和、字母异位词分组、最长连续序列

哈希 1. 两数之和题目描述解题思路步骤&#xff1a;时间复杂度&#xff1a;空间复杂度&#xff1a; 代码实现 2. 字母异位词分组题目描述解题思路步骤&#xff1a;时间复杂度&#xff1a;空间复杂度&#xff1a; 代码实现 3. 最长连续序列题目描述解题思路关键思路&#xff1a;…...

Jenkins 通过 Execute Shell 执行 shell 脚本 七

Jenkins 通过 Execute Shell 执行 shell 脚本 七 一、创建 .sh 文件 项目目录下新建 .sh 文件 jenkins-script\shell\ci_android_master.sh添加 Execute Shell 模块 在 Command 中添加 # 获取 .sh 路径 CI_ANDROID_MASTER_PATH"${WORKSPACE}/jenkins-script/shell/…...

无人机常见的定位方式

目录 1、卫星导航定位 2、基于地面基站定位 3、惯性导航定位 4、视觉定位 5、其他定位技术 目前无人机的定位方式主要有以下几种&#xff1a; 1、卫星导航定位 GPS 定位&#xff1a;全球定位系统是应用最广泛的卫星导航系统&#xff0c;无人机上的 GPS 接收器接收至少四…...

【Git版本控制器】:第一弹——Git初识,Git安装,创建本地仓库,初始化本地仓库,配置config用户名,邮箱信息

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ 相关笔记&#xff1a; https://blog.csdn.net/dj…...

使用 EDOT 监测由 OpenAI 提供支持的 Python、Node.js 和 Java 应用程序

作者&#xff1a;来自 Elastic Adrian Cole Elastic 很自豪地在我们的 Python、Node.js 和 Java EDOT SDK 中引入了 OpenAI 支持。它们为使用 OpenAI 兼容服务的应用程序添加日志、指标和跟踪&#xff0c;而无需任何代码更改。 介绍 去年&#xff0c;我们宣布了 OpenTelemetry…...

基于 STM32 的病房监控系统

标题:基于 STM32 的病房监控系统 内容:1.摘要 基于 STM32 的病房监控系统摘要&#xff1a;本系统采用 STM32 微控制器作为核心&#xff0c;通过传感器实时监测病房内的环境参数&#xff0c;如温度、湿度、光照等&#xff0c;并将数据上传至云端服务器。医护人员可以通过手机或…...

线上HBase client返回超时异常分析 HBase callTimeout=60000

问题现象 HBase client直接返回超时异常 HBase callTimeout=60000, callDuration=60301: row ‘12649160863966c2790195059018040900010003320’ on table ‘Z_UPA’ at region=Z_UPA,1213d1a56,1184027415643. ba7224f83dbb09591a74b7059f17., hostname=abcd,60020,891863950…...

03.开闭原则详细介绍

03.开闭原则详细介绍 目录介绍 01.问题思考的分析02.如何理解开闭原则03.开闭原则的背景04.开闭原则比较难学05.实现开闭原则方式06.画图形案例分析07.银行业务案例分析08.开闭原则优缺点09.开闭原则的总结 推荐一个好玩网站 一个最纯粹的技术分享网站&#xff0c;打造精品…...

前端职业规划

前端开发的职业规划可以根据个人兴趣、技术深度和职业目标来制定。以下是一个典型的前端开发者职业发展路径&#xff0c;涵盖了从初级到高级的不同阶段&#xff0c;以及未来的发展方向&#xff1a; 1. 初级阶段&#xff08;0-2 年&#xff09; 目标&#xff1a;掌握基础技能&a…...

杂记:STM32 调试信息打印实现方式

杂记&#xff1a;STM32 调试信息打印实现方式 一、引言二、使用 USART 串口打印原理&#xff08;二&#xff09;实现步骤硬件连接代码实现 使用 ST - LINK 调试器 ITM 打印&#xff08;一&#xff09;原理&#xff08;二&#xff09;实现步骤硬件连接代码实现 四、使用 Semihos…...

python+unity落地方案实现AI 换脸融合

先上效果再说技术结论&#xff0c;使用的是自行搭建的AI人脸融合库&#xff0c;可以离线不受限制无限次生成&#xff0c;有需要的可以后台私信python ai换脸融合。 TODO 未来的方向&#xff1a;3D人脸融合和AI数据训练 这个技术使用的是openvcinsighface&#xff0c;openvc…...

ComfyUI流程图生图原理详解

一、引言 ComfyUI 是一款功能强大的工具&#xff0c;在图像生成等领域有着广泛应用。本文补充一点ComfyUI 的安装与配置过程遇到的问题&#xff0c;并深入剖析图生图过程及相关参数&#xff0c;帮助读者快速入门并深入理解其原理。 二、ComfyUI 的安装与配置中遇到的问题 &a…...

终极免费风扇控制软件:FanControl完整配置与优化指南

终极免费风扇控制软件&#xff1a;FanControl完整配置与优化指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/…...

41.ShadCN 是什么?它如何和 Tailwind CSS 集成,从而更容易构建可访问且可自定义的 React 组件?

shadcn/ui 不是传统意义上“装一个 npm 包就能用的组件库”。它更像一个组件代码生成/分发方案&#xff1a;你通过 shadcn CLI 把组件的 TypeScript 源码直接拷贝进你的项目目录&#xff0c;组件样式用 Tailwind CSS 写好&#xff0c;组件交互与无障碍能力通常基于 Radix UI pr…...

如何让Windows任务栏变透明:TranslucentTB终极美化指南

如何让Windows任务栏变透明&#xff1a;TranslucentTB终极美化指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 想让你的Windows桌面焕…...

老旧电视焕发新生:MyTV-Android开源直播应用完整指南

老旧电视焕发新生&#xff1a;MyTV-Android开源直播应用完整指南 【免费下载链接】mytv-android 使用Android原生开发的视频播放软件 项目地址: https://gitcode.com/gh_mirrors/my/mytv-android 你是否还在为家中老旧智能电视无法安装现代直播应用而烦恼&#xff1f;那…...

【2026前沿】LTX 2.3 深度实战:结合 Gemma 4完全体 打造电影级文生视频/图生视频全流程

一、 为什么 LTX 2.3 是 2026 年视频生成的“性价比之王”&#xff1f;LTX 2.3 在保留了上一代高速生成特性的基础上&#xff0c;在 VAE&#xff08;变分自编码器&#xff09; 进行了重构。相比于 LTX 2.0&#xff0c;它的核心优势在于&#xff1a;原生纵向支持&#xff1a;不再…...

Yeti社区插件生态解析:如何利用现有资源快速扩展平台功能

Yeti社区插件生态解析&#xff1a;如何利用现有资源快速扩展平台功能 【免费下载链接】yeti Your Everyday Threat Intelligence 项目地址: https://gitcode.com/gh_mirrors/ye/yeti Yeti作为一款强大的威胁情报平台&#xff08;Your Everyday Threat Intelligence&…...

CANN/asc-devkit Reset函数说明

Reset 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言&#xff0c;原生支持C和C标准规范&#xff0c;主要由类库和语言扩展层构成&#xff0c;提供多层级API&#xff0c;满足多维场景算子开发诉求。 项目地址: https://gitcode.com/cann…...

从 Classic ABAP 走到 ABAP Cloud,开发习惯、架构边界与 Clean Core 的重新建立

今天还在做 SAP S/4HANA 项目的人,大多已经感受到一个很现实的变化,真正难迁移的,从来不只是几段旧代码,也不只是把 SE80 里的对象搬到一个新工具里,而是整个开发思路要重新校准。以前很多团队习惯把 ABAP 当成一个紧贴业务系统内核的实现层,屏幕逻辑、数据库访问、增强点…...

Java基础——抽象类与接口

前言&#xff1a; 在Java面向对象编程中&#xff0c;抽象类&#xff0c;接口&#xff0c;内部类以及Object类是构建灵活&#xff0c;可拓展代码的核心工具。理解它们的区别与联系&#xff0c;掌握使用场景&#xff0c;是每一位Java开发者进阶的必经之路。 本文将结合通俗易懂的…...

西安石油大学仪光实践协会4月活动机械蝴蝶台灯

项目简介该项目使用stm32芯片设计了一个灯光&#xff0c;300减速&#xff0c;可灯光颜色变化&#xff0c;和电机转向控制。制作了一个简单有趣的动态可控台灯。使用电源控制ic芯片&#xff0c;可与连接电池&#xff0c;对电池进行充电&#xff0c;并且显示电池剩余电量。实现制…...