JVM类加载过程详解:从字节码到内存的蜕变之旅
一、类加载的意义与整体流程
在Java中,每一个.java
文件经过编译都会生成.class
字节码文件。但字节码本身并不能直接运行,必须通过 类加载(Class Loading)将其转化为JVM内存中的数据结构,才能被程序调用。
类加载过程就像一座精密的工厂流水线,将原材料(字节码)加工成可运行的类对象。
类的完整生命周期包含7个阶段:加载 → 验证 → 准备 → 解析 → 初始化 → 使用 → 卸载。其中验证、准备、解析统称为 连接(Linking)阶段。
二、类加载的五大阶段详解
1. 加载(Loading):字节码的搬运工
核心任务:将字节码载入方法区,并生成Class对象
- 二进制获取:通过全限定名(如
java.lang.String
)获取字节流,来源包括JAR包、网络、动态代理等 - 数据结构转换:将静态存储结构转换为方法区的运行时结构
- Class对象生成:在堆内存中创建
java.lang.Class
实例,作为访问入口
类加载器小贴士:加载工作由类加载器完成,采用双亲委派机制确保安全。例如加载
java.lang.Object
时,最终由启动类加载器完成。
2. 验证(Verification):安全守门员
四重安全检测机制:
- 文件格式验证:魔数检查(是否以
0xCAFEBABE
开头)、版本号验证等- 元数据验证:语义检查(是否继承final类、抽象方法实现等)
- 字节码验证:程序逻辑验证(类型转换是否合法、跳转指令正确性等)
- 符号引用验证:确保后续解析能正常执行(检查引用的类/方法是否存在)

// 示例:符号引用验证失败案例
public class Demo {public void test() {// 如果SomeClass不存在,解析时会抛出NoClassDefFoundErrorSomeClass.doSomething(); }
}
3. 准备(Preparation):内存分配的预演
- 类变量内存分配:为static变量分配内存(JDK7+存储在堆中)
- 初始值设定:
- 普通static变量:设置数据类型的零值(int=0, boolean=false等)
- final static变量:直接赋代码中的值
public class Example {public static int value = 123; // 准备阶段value=0public static final int F_VALUE = 456; // 准备阶段F_VALUE=456
}
4. 解析(Resolution):符号到引用的转换
将常量池中的符号引用替换为直接引用:
- 符号引用:以一组符号描述所引用的目标(如全限定名)
- 直接引用:指向目标的指针、偏移量等能直接定位的内存地址
符号引用类型 | 转换目标 |
---|---|
类/接口 | 方法区类型信息 |
字段 | 内存偏移量 |
方法 | 方法表索引 |
5. 初始化(Initialization):真正的诞生时刻
执行类构造器<clinit>()
方法,完成:
- static变量的赋值
- static代码块的执行
初始化触发条件(满足任一即触发):
new
实例对象、访问/设置静态字段(非final)、调用静态方法- 反射调用(如
Class.forName()
)- 初始化子类时发现父类未初始化
- JVM启动时指定的主类
- 使用MethodHandle/VarHandle的调用点
public class InitDemo {static {System.out.println("静态代码块执行"); }public static int value = initValue();private static int initValue() {System.out.println("静态方法调用");return 100;}
}
// 首次访问InitDemo.value时,输出顺序:
// 静态代码块执行 → 静态方法调用
三、类卸载:生命的终结
卸载三要素:
- 该类的所有实例已被GC回收
- 没有其他地方引用该类
- 加载该类的ClassLoader实例已被GC
重要特性:由系统类加载器加载的类几乎不会被卸载,而自定义类加载器加载的类可能被卸载。例如OSGi框架通过自定义加载器实现模块热部署。
四、高频面试问题解析
Q1:准备阶段和初始化阶段对static变量的处理有何不同?
- 准备阶段:设置默认零值
- 初始化阶段:执行代码中的赋值操作
Q2:以下代码会输出什么?
public class Singleton {private static Singleton instance = new Singleton();public static int value1;public static int value2 = 0;private Singleton() {value1 = 1;value2 = 1;}public static void main(String[] args) {System.out.println(Singleton.value1); // 输出1System.out.println(Singleton.value2); // 输出0}
}
解析:初始化顺序导致value2被覆盖。具体执行顺序:
- 准备阶段:instance=null, value1=0, value2=0
- 初始化阶段:
- 执行
new Singleton()
→ value1=1, value2=1- 执行value2显式赋值 → value2=0
Q3:如何打破双亲委派模型?
通过重写ClassLoader的loadClass()
方法,典型应用:
- Tomcat:Web应用类隔离
- SPI机制:线程上下文类加载器
码字不易,希望可以一键三连,我们下期文章再见!!!
相关文章:

JVM类加载过程详解:从字节码到内存的蜕变之旅
一、类加载的意义与整体流程 在Java中,每一个.java文件经过编译都会生成.class字节码文件。但字节码本身并不能直接运行,必须通过 类加载(Class Loading)将其转化为JVM内存中的数据结构,才能被程序调用。 类加载过程就…...
【力扣Hot100详解】解锁“字母异位词分组”:用排序魔法一键通关力扣!
字母异位词分组,力扣第49题,看似是“找不同”的排列游戏,实则是哈希表与字符串处理的经典结合。这道题就像是一把钥匙,能帮你打开“如何高效归类数据”的算法大门。今天,我们就用 Java 带你用“排序魔法”轻松破解它&a…...

vite配置scss全局变量
vite配置scss全局变量 创建单独文件variable.scss在其中定义变量 vite.config.ts中配置 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path// https://vite.dev/config/ export default defineConfig({plugins: [vue()],resolve:…...
Spring Boot01(注解、)---java八股
Spring Boot中常用注解及其底层实现 1、SpringBootApplication注解: SpringBootApplication注解:这个注解标识了一个SpringBoot工程,它实际上是另外三个注解的组合,这三个注解是: aSpringBootConfiguration:…...

2.19学习记录
Web easyupload3.0 这是一道构造.htaccess文件的传马 如下: <FilesMatch "jpg">SetHandler application/x-httpd-php </FilesMatch>.htaccess文件可以作为一个解释器,可以将传进去的图片马改为php马上传之后再传个图片马&#…...

汽车免拆诊断案例 | 2013 款奔驰 S300L 车起步时车身明显抖动
故障现象 一辆2013款奔驰S300L车,搭载272 946发动机,累计行驶里程约为15万km。车主反映,将挡位置于D挡,稍微释放一点制动踏板,车辆蠕动时车身明显抖动,类似气缸失火时的抖动,又类似手动变速器…...

【HeadFirst系列之HeadFirst设计模式】第5天之工厂模式:比萨店的秘密武器,轻松搞定对象创建!
工厂模式:比萨店的秘密武器,轻松搞定对象创建! 大家好,今天我们来聊聊设计模式中的工厂模式。如果你曾经为对象的创建感到头疼,或者觉得代码中到处都是 new 关键字,那么工厂模式就是你的救星!本…...
Redis如何解决热Key问题
目录 **如何解决 Redis 的热 Key(Hot Key)问题?****解决方案** **1. 使用多级缓存****方案** **2. 进行 Key 预分片(Key Sharding)****方案** **3. 使用 Redis 复制机制(主从复制或集群)****方案…...

从开发到部署:EasyRTC嵌入式视频通话SDK如何简化实时音视频通信的集成与应用
嵌入式设备和视频综合管理平台均支持B/S架构。在B/S架构下,传统的视频观看方式依赖于微软的OCX控件,然而OCX控件的使用正面临越来越多的挑战: 首先,用户需要安装浏览器插件、调整浏览器安全级别,并允许ActiveX控件弹出…...
Zookeeper(58)如何在Zookeeper中实现分布式锁?
在 Zookeeper 中实现分布式锁是一种常见的用例。Zookeeper 提供了强一致性、高可用性的分布式协调服务,使得它非常适合用来实现分布式锁。以下是详细的步骤和代码示例,展示如何在 Zookeeper 中实现分布式锁。 1. Zookeeper 分布式锁的基本原理 Zookeep…...

Mac端homebrew安装配置
拷打了一下午o3-mini-high,不如这位博主的超强帖子,10分钟结束战斗 跟随该文章即可,2025/2/19亲测可行 mac 安装HomeBrew(100%成功)_mac安装homebrew-CSDN博客文章浏览阅读10w次,点赞258次,收藏837次。一直觉得自己写…...
Spring 接入 DeepSeek
引入依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-openai-spring-boot-starter</artifactId> </dependency>2.yml配置 spring:ai:openai:api-key: sk-xxxxx // 填写自己申请的keybase-url: http…...
vscode将文件中行尾默认CRLF改为LF
安装prettier npm install --save-dev --save-exact prettier执行命令 npx prettier --write --end-of-line lf .即可将项目中的所有文件行尾序列格式改为lf *在你使用git拉取代码的时候,git会自动将代码当中与你当前系统不同的换行方式转化成你当前系统的换行方…...

python-leetcode 33.排序链表
题目: 给定链表的头结点head,请将其按升序排列,并返回排序后的链表 方法一:自顶向下归并排序 链表自顶向下归并排序的过程: 1.找到链表的中点,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以…...

【数据结构初阶第十二节】设计循环队列
云边有个稻草人-CSDN博客 必须有为成功付出代价的决心,然后想办法付出这个代价。 还有最后一道关于队列的习题,这题有点难,准备好迎接挑战吧! 目录 1.【题目】 2.实现循环队列推荐用数组,Why? 3.Q1:如…...

基于微信小程序的民宿短租系统设计与实现(ssm论文源码调试讲解)
第4章 系统设计 4.1系统设计的目标 系统设计的目标是满足用户的需求和满足系统实现所需要的所有要求。本系统收集了信息浏览、信息删除、信息添加、信息修改、信息查询为一体[17]。改变了用户民宿短租的方式,提高管理员管理效率以及用户预订的效率。为用户、房主提…...
使用 Jetty 构建 HTTPS 服务入门指南
在互联网安全越来越重要的今天,使用 HTTPS 为 Web 服务提供安全传输成为标准配置。Jetty 是一个高性能、易用且功能丰富的开源 Java HTTP 服务器和 Servlet 容器,能够轻松实现 HTTPS 支持。本文将结合代码实例,引导您快速搭建一个基于 Jetty 的 HTTPS 服务。 一、Jetty 简介…...
数据结构《图》
数据结构《图论》 图的性质 一、无向图(Undirected Graph) 定义 由一组顶点(Vertex)和一组无向边(Edge)构成。 每条无向边用一条无方向的线段连接两个顶点,记为 ( (u, v) ),其中…...

用Chrome Recorder轻松完成自动化测试脚本录制
前言 入门自动化测试,录制回放通常是小白测试首先用到的功能。而录制回放工具也一直是各大Web自动化测试必然会着重提供的一块功能。 早期WinRunner、QTP这样的工具,自动化测试可以说是围绕录制回放开展的。近年像Selenium也提供有录制工具 Selenium IDE,Playwright也包含…...

⭐️苹果电脑安装windows10双系统【详细图文步骤保姆级教程】【本教材适用于MAC台式机、笔记本MacBook air和pro】
苹果电脑安装windows10双系统【详细图文步骤保姆级教程】【本教材适用于MAC台式机、笔记本MacBook air和pro】 苹果电脑安装windows10双系统一、准备工作准备项1:U盘作为系统安装盘准备项2:您需要安装的系统镜像 二、启动转换助理步骤1:找到启…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...