实用指南:Java类加载机制
Java 的类加载机制是 JVM(Java 虚拟机)的核心组成部分,负责将字节码(.class 文件)加载到内存并转换为可执行状态。以下是关于类加载机制的详细知识点:
一、类加载的基本概念
定义
类加载是指将类的字节码数据(.class 文件)读入内存,解析并生成对应的java.lang.Class
对象,使类能够被 JVM 使用的过程。时机
类加载通常在首次使用类时触发(懒加载),例如:- 创建类的实例(
new
关键字) - 调用类的静态方法或访问静态变量
- 反射调用(
Class.forName()
) - 初始化子类时(需先加载父类)
- 创建类的实例(
二、类加载的完整流程(生命周期)
类从加载到卸载经历 5 个阶段,其中加载、验证、准备、初始化、卸载的顺序是固定的,解析阶段可能与初始化交叉进行:
1. 加载(Loading)
- 任务:通过类的全限定名(如
com.example.User
)获取其字节码数据,并生成Class
对象。 - 来源:字节码可来自本地文件、网络、数据库、动态生成(如 CGLib)等。
- 关键组件:类加载器(ClassLoader)负责此阶段。
2. 验证(Verification)
- 任务:确保字节码符合 JVM 规范,避免恶意或无效字节码危害虚拟机安全。
- 验证内容:
- 文件格式验证(魔数、版本号等)
- 元数据验证(类继承关系、字段方法合法性)
- 字节码验证(指令逻辑正确性)
- 符号引用验证(常量池引用有效性)
3. 准备(Preparation)
- 任务:为类的静态变量分配内存并设置初始默认值(非显式赋值)。
- 例如:
public static int a = 10;
在准备阶段a
的值为0
(int 默认值),显式赋值在初始化阶段执行。
- 例如:
- 注意:仅静态变量(类变量)参与此阶段,实例变量在对象创建时分配内存。
4. 解析(Resolution)
- 任务:将常量池中的符号引用(如类名、方法名)转换为直接引用(内存地址)。
- 触发时机:通常在初始化前完成,但某些情况下(如动态绑定)会延迟到运行时解析。
5. 初始化(Initialization)
- 任务:执行类的初始化逻辑,包括:
- 静态变量的显式赋值
- 静态代码块(
static {}
)的执行
- 顺序规则:
- 父类初始化优先于子类
- 静态变量和静态代码块按代码出现顺序执行
- 触发条件(主动使用):
- 创建实例、调用静态方法 / 变量
- 反射(
Class.forName()
) - 启动类(含
main
方法的类) - 初始化子类时触发父类初始化
三、类加载器(ClassLoader)
类加载器负责 “加载” 阶段,通过全限定名获取字节码。JVM 中存在以下几类加载器:
1. 内置类加载器
启动类加载器(Bootstrap ClassLoader)
- 由 C++ 实现(非 Java 类),负责加载 JDK 核心类库(如
rt.jar
、resources.jar
)。 - 父加载器为
null
,不继承java.lang.ClassLoader
。
- 由 C++ 实现(非 Java 类),负责加载 JDK 核心类库(如
扩展类加载器(Extension ClassLoader)
- 加载 JDK 扩展目录(如
jre/lib/ext
)中的类。 - 父加载器为启动类加载器。
- 加载 JDK 扩展目录(如
应用程序类加载器(Application ClassLoader)
- 加载用户类路径(
classpath
)下的类,是默认的类加载器。 - 父加载器为扩展类加载器。
- 加载用户类路径(
2. 自定义类加载器
- 继承
java.lang.ClassLoader
,重写findClass()
方法(推荐)或loadClass()
方法。 - 应用场景:热部署、加密类解密、从非标准来源加载类等。
3. 双亲委派模型
定义:类加载时,先委托父加载器加载,父加载器无法加载时才由当前加载器尝试加载。
流程:
自定义加载器 → 应用程序类加载器 → 扩展类加载器 → 启动类加载器
(若所有父加载器均无法加载,则由当前加载器调用findClass()
加载)作用:
- 避免类重复加载(保证同一个类在 JVM 中唯一)。
- 保护核心类库(如
java.lang.String
不会被恶意替换)。
破坏双亲委派:
可通过重写loadClass()
方法实现(如 Tomcat 的类加载器需隔离不同 Web 应用)。
四、类的卸载
- 当类的
Class
对象不再被引用,且加载该类的类加载器被回收时,类会被卸载。 - 条件:
- 该类的所有实例已被回收。
- 该类的
Class
对象无引用。 - 加载该类的类加载器已被回收。
- 注意:JVM 内置加载器加载的类(如核心类库)通常不会被卸载,缘于其加载器始终存在。
五、关键特性与问题
类的唯一性
一个类的唯一性由 “全限定名 + 类加载器” 共同决定。不同加载器加载的同全限定名类视为不同类。延迟加载与预加载
- 大多数类采用延迟加载(首次使用时加载)。
- 少数类(如
java.lang.Object
)会被 JVM 预加载。
常见异常
ClassNotFoundException
:类加载器无法找到指定类(如类路径错误)。NoClassDefFoundError
:类编译时存在,但运行时未找到(如依赖缺失)。
总结
Java 类加载机制通过 “加载 - 验证 - 准备 - 解析 - 初始化” 的流程,结合双亲委派模型,保证了类的安全加载和 JVM 的稳定性。理解类加载机制对排查类冲突、实现热部署等场景至关重要。
相关文章:
实用指南:Java类加载机制
实用指南:Java类加载机制pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size…...
C 语言注释
C 语言有两种注释, 即 // 和 /* ... */. /* */ 被称为 C 风格的注释, 是 ANSI C 的注释. // 被称为 C++ 风格的注释, 是 C99 新增的注释, 只有支持 C99 和 C11 的编译器才能识别这种注释. 该风格的注释被广泛应用于 C++ 和 Java. 注释在预编译阶段会被替换为一个空格. 代码示例…...
扫描线
前题引入 扫描线是用来求给你n个矩阵求他们围起来的总面积。 问题分析 可能有一些弱智的小朋友说直接把所有的矩阵的面积加起来再减掉重复的不就可以啦。 如果,你这么想请问(1<=n<=1e5)请问你该如何应对,所以我们就引入了个新算法:扫描线(废话) 先在我们先画一张图:…...
C语言中的查找与排序算法整理
查找与排序算法整理 1 查找算法 1.1 顺序查找 1.1.1 算法原理 顺序查找又称线性查找,是一种基本的查找算法,其原理是:从头开始遍历:从数据集的起始位置开始,逐个检查每个元素。 比较目标:对于每个遍历到的元素,将其与目标元素进行比较。 查找成功:如果当前元素等于目标…...
k8s练习
k8s练习 1. 简述Kubernetes是什么? Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。 2. Kubernetes的组成有哪些? Kubernetes主要由以下几个组件组成:kube-apiserver:提供REST API服务,作为系统的控制入口。 kube-controller-manager:执…...
css-2
css正常布局流浮动弹性盒子a {//行内盒子,比如a如果给了flex布局,则可以直接设置宽高display: flex }淘宝京东多行伸缩布局 瀑布流百度图片综合案例...
AtCoder Beginner Contest 423 ABCDEF 题目解析
A - Scary Fee 题意 你的存折中有 \(X\) 元,从存折中取钱需要花手续费。 取钱必须以 \(1000\) 元为单位,并且每取 \(1000\) 元就需要额外支付 \(C\) 元的手续费。 问你最多可以取出多少钱? 思路 我们可以把 \(C\) 元手续费当作单次取钱的一部分,也就是每当我们想取 \(1000\…...
numpy中的shape属性
.shape 不是一个函数,而是numpy的一个属性(attribute),用于获取数组维度信息。它返回一个元组(tuple),元组中的每个元素代表对应维度的大小。 import numpy as np# 1D 数组 (向量) arr1d = np.array([1, 2, 3, 4, 5]) print(f"数组内容: {arr1d}") print(f&qu…...
mac 查看fat32磁盘
1.首先安装社区维护的ntfs工具。 brew tap gromgit/homebrew-fuse #### brew install ntfs-3g2.然后就是mount啦 这里的/dev/diskXsY 就是自己看啦,看到下面是没有externatl(外部拓展这一项的,或者使用磁盘工具,如果插上了u盘也是可以看到的)然后使用命令 mkdir /Volumes/…...
使用Smart-Doc为Java项目生成gRPC API文档
本文详细介绍了如何在Java微服务项目中利用Smart-Doc工具自动生成gRPC API文档,包括配置步骤、优势分析以及实际操作指南,帮助开发者高效管理API文档。Smart-Doc:在Java项目中生成gRPC API文档 在现代Java微服务中,gRPC通过其高效的二进制协议和多语言支持简化了服务间通信…...
数字时钟用的什么字体
下载字体 字体 DS-Digital放置字体 引入字体:<style scoped> /* 定义字体 */ @font-face {font-family: DS-Digital; /* 自定义字体名称 *//* 引入不同格式的字体文件,确保兼容性 */src: url(@/assets/fonts/DS-DIGI.TTF) format(truetype),url(@/assets/fonts/DS-DIG…...
Python数据分析零基础完整课程大纲(详细版)【202509第1版】 - 指南
Python数据分析零基础完整课程大纲(详细版)【202509第1版】 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier Ne…...
详细介绍:uni-app 根据用户不同身份显示不同的tabBar
详细介绍:uni-app 根据用户不同身份显示不同的tabBarpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monos…...
VSTO QQ群 61840693 解散通知【新群193203228 】
由于各种原因,成立16年的VSTO交流群于近日停用,损失粉丝两千人。 感谢这么多年热爱我的粉丝,如果还要跟我学习VBA,请加新群193203228...
kettle从入门到精通 第107课 ETL之kettle json_input 一个点号引发的血案
场景:在一个kettle交流群内,有一个小伙伴求助:大致意思是json input的输入参数的key中存在点号,凡是带点号的key都无法正确获取。 今天一起来分析下使用多种方式来解决这个问题,希望后续有人遇到此类问题时可以秒杀它,而不是花费N根头发!!! 1、json数据构造{"id&…...
【2024-2025第二学期】助教工作学期总结
一、助教工作的具体职责和任务: 作为《人工智能导论》课程助教,我的主要职责包括协助课程老师完成教学支持工作,确保课程顺利运行。具体任务包括:前期负责对接课程老师对比赛进行组织,比如数字中国创新大赛的各赛道报名、统计第十六届视觉艺术设计赛省赛的报名、上课后课程…...
Clion 实现多个 main 函数执行互不影响
安装插件 C/C++ single File Execution。如果 Clion 中安装不上,可以在官网安装:安装成功后,源文件右键,会提示:点击后,Clion 的右下角会提示:reload 这个文件夹:选择刚刚 add 的源文件,即想要执行的源文件:在 main.c 和 Hello.c 两个源文件都包含 main() 函数时也可…...
腾讯终于对Claude code下手了?我拿它跑完一个真实项目,结果有点意外…
前几天看腾讯也发布和开源了他们的Claude code,名字是Codebuddy code。 就下载下来试了试效果(说实话,一开始是冲着它能免费用GPT-4o、Claude 3.5这些顶级模型去的)。 整体来看效果还不错,对于刚开始发布来说,我认为已经可以初步当做生产力工具了。 目前国内版本可以使用的…...
快速利用AI读论文
使用Gemini 2.5 Pro,每天可以有五次请求 提示词如下 **Role:** You are a seasoned researcher in the field of artificial intelligence and computer vision. You excel at interpreting cutting-edge academic papers in a clear and structured manner and can disting…...
第一周预习作业(AI)
你好,很高兴认识你。...
HTTP协议核心概念全解析 - 实践
HTTP协议核心概念全解析 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font…...
Django过时了吗?从ASGI到AI时代的思考
前言 本文本来只是 DjangoStarter v3.2.1 新版本发布博客里的一段思考,不过越写越长,干脆拆分成一篇独立的文章得了。😄“Django 过时了吗?” 这是一个几乎每天都能在论坛、Reddit 或知乎上看到的问题。 但仔细想想,这个问题的背后并不是“Django 变烂了”,而是技术趋势…...
日常练习一部分
这一次练习不使用后端,只进行对使用vue3的前端练习,包括两种不同的跳转方式: 我的部分代码大致如下: DashboardView.vue: <template><div><h1>仪表盘视图</h1><p>这是您的个人仪表盘,显示各种统计信息。</p><div class="sta…...
世界史
约200000万年前,天在地的下方,但是地与天无法展示与观测,山与河都一并随着天去了遥远的歌声,日月的光辉敲响了【命运】的洪钟,于此,在钟声中,产生了最初的生命,在日月的抚慰下,生命活了,死了,分裂了,一二三四五,哦,原来【数据删除】在这里,这真是太美妙了。 最初…...
罗技M275鼠标滚轮断轴维修:建模+3D打印修复全过程
本文记录了一次鼠标滚轮损坏的维修过程。经拆解发现,滚轮与编码器连接的中心轴从根部断裂。由于原装配件价格接近鼠标本体价值,作者决定采用 3D 打印方式自制替换件。初步尝试使用开源模型失败后,使用游标卡尺对原件进行尺寸测量,并重新建模。在打印过程中,分别测试了纵向…...
Unity:网络编程
Socket 服务端至少要两个socket:一个负责接收客户端连接请求,但不负责与客户端通信;为每个连接成功的客户端,在服务端创建一个对应的socket负责与客户端通信。 客户端的socket一个就行:要指定连接的服务端的IP和端口。 通讯过程:申请一个socket 绑定IP和端口 监听 服务端…...
【比赛记录】2025CSP-S模拟赛45
A B C D Sum Rank10 - 75 20 105 16/24A. 染色(color) 考虑奇偶性染色,于是就满足了所有奇质数的限制。但是由于有 \(2\) 的存在,所以需要每四个染一个色。考虑 \(1,3,6,8\) 每两个数之差都是质数,因此 \(n\ge8\) 时答案不可能小于 \(4\)。\(n<8\) 时打表打出来即可。Cod…...
PWN手的成长之路-01
首先启动题目环境,并下载题目的附件。远程nc连接一下,发现程序就是把用户输入再次输出,并加了几句话。之后从附件下手,用file查看文件的详细信息。发现是一个linux的可执行程序。使用checksec查看文件的安全属性。P.S.详细解释查看后的信息含义: Arch: 程序架构信息。判断…...
SpringCloud全解:核心组件与实战案例 - 教程
SpringCloud全解:核心组件与实战案例 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !im…...
学起plus刷课
// ==UserScript== // @name 自动下一集-学起刷课(可用版) // @namespace https://cjlzulms.sccchina.net/ // @version 2.0 // @description 用户首次点击播放后,自动连播下一集 // @author You // @match https://cjlzulms.sccchina.net/ve…...
Windows 安装人大金仓数据库 KingbaseES_V008R006
1、安装前准备 1.1、最低硬件环境要求CPU 内存 硬盘2 核 512 MB 10 GB 空闲空间1.2、下载人大金仓数据库安装包官网下载地址:https://www.kingbase.com.cn/xzzx/index.htm注意:在官网下载人大金仓数据库安装包时,需要提供下载方相关信息1.3、校验安装包的完整性如上图所示,…...
Hadoop(十) - 教程
Hadoop(十) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14p…...
如何注入像 MyBatis 一样注入接口
如何注入像 MyBatis 一样注入接口1.概述 我们在使用mybatis 的时候,我们发现实际上我们就是使用接口,没有实现类,但是spring 容器一样可以正常使用接口操作数据,这个是怎么做到的呢,实际上这里使用了代理模式和 spring的FactoryBean。 本文就用一个简单的例子来实现一个接…...
10 个优质周公解梦网站推荐及解析参考
梦境是潜意识的低语,也是传统文化的载体。周公解梦作为千年流传的解梦智慧,承载着古人对梦的洞察。如今,这些智慧通过网络得以延续,为人们解析梦境寓意、探寻心灵奥秘提供参考。以下推荐 10 个优质解梦网站,助你在传统与现代视角中读懂梦境。周公解梦官方网站 https://www…...
软件工程_个人项目
软件工程_个人项目个人项目报告项目 内容这个作业属于哪个课程 [软件工程](首页 - 计科23级12班 - 广东工业大学 - 班级博客 - 博客园)这个作业要求在哪里 [作业要求](个人项目 - 作业 - 计科23级12班 - 班级博客 - 博客园)这个作业的目标 训练个人项目软件开发能力,学会使用性…...
深入解析:环境搭建与你的第一个 Next.js 应用
深入解析:环境搭建与你的第一个 Next.js 应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !i…...
在 Ubuntu 中处理中文路径
在 Ubuntu 系统中,默认情况下会创建一些中文目录,如 “桌面”、“文档”、“图片” 等。这些目录在命令行操作时可能会带来不便,可以将这些中文目录转换为英文目录,或者在保持中文界面的同时使用英文目录。 终端输入 export LANG=en_US 并执行,终端输入 xdg-user-dirs-gtk…...
202212_风二西_冰蝎流量分析
流量分析,冰蝎木马,rebeyond,AES,pysharkTags:流量分析,冰蝎木马,rebeyond,AES,pyshark 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:附件名称 0x01. WP 分析及解密脚本 exp.py # -*- coding: utf-8 -*- im…...
记账:出入报表
原创 夏哥188 夏哥10761776 2025年09月14日 09:01 四川 出入报表:不同于收支报表,出入报表会包含转账流水,对于查看水电气账户出入账很有用。 查询出入报表:底部ledgers直接输入3(下拉框只有收支科目可选,3表示转账需手动输入),底部accounts选择水电气账户,分组等其他…...
[AGC028D] Chords 题解
$ \text{[AGC028D] Chords 题解}$ 整体来讲比较中规中矩的一个题。 首先这个圆上给到你你就没法处理。常规的操作是断环成链,发现实际上圆上线段相交等价于线段上线段“真相交”,即不包含的相交。然后你还是不会做。看题目让求什么,求所有方案中联通块的个数和你显然是不会的…...
记账:报表
原创 夏哥188 夏哥10761776 2025年09月10日 09:14 四川点击顶部的“accounts”即可在“报表/记一笔”之间切换,默认展示月收支报表:长按底部的"accounts"可以多选账户(或直接输入表示水电气的5,6,7),点击底部的“分组”选择“account”会列出各账户收支(红色表…...
记账:灵活转账
原创 夏哥188 夏哥10761776 2025年09月12日 09:01 四川 灵活转账可记房贷、还信用卡、垫资等房贷:例如20万房贷,10年期等额本金,利率3.1%,建议按以下方式记还贷(等额本息更简单,房贷初始化为本息总额,每期转账固定金额到房贷即可);每期还本金20万/120期=1666.67,本金…...
记账:批量更新
原创 夏哥188 夏哥10761776 2025年09月13日 09:02 四川 批量更新,配合多条件查询,可以方便地更新多条流水。 配置查询条件:记一笔的5项内容可勾选对应的复选框作为查询条件,备注输入内容直接作为查询条件,下图为查询备注包含“房贷”的流水勾选“记一笔”右边的复选框,启…...
记账:水电气话费
原创 夏哥188 夏哥10761776 2025年09月11日 08:50 四川 水电气话费通常是预充值账户,并且还可以使用各种渠道获取的立减金等优惠,下面介绍一些水电气话费的记账场景:领到了满5.01减5元的立减金,有两种记账方式(更推荐第二种)选择转账-充值,金额:0.01,红包:5,账户:现…...
《原子习惯》-读书笔记1
2025-09-14 Day1 1、本书的核心内容是我有关培训习惯的四步模型——提示、渴求、反应和鼓励,以及从这些步骤中演化出来的“行为转变四大定律”。2、与以往绩效总监不同的是,他一丝不苟地执行自己制定的“聚合微小进步”的战略,其基本理念就是在你所做的每一件事上寻求哪怕极…...
记账:记一笔
原创 夏哥188 夏哥10761776 2025年09月09日 08:22 四川 记账功能支持记一笔/更新、多条件查询。 记一笔:类型:三选一,默认支出(日常生活支出比较多),可再选科目金额:必填,最简单的记一笔只需填金额就行,其他默认即可账户:默认现金,如果是记水电气等支出则下拉选择对…...
记账:快速上手
原创 夏哥188 夏哥10761776 2025年09月08日 15:23 四川 此文介绍一款记账应用,特色有:简单、灵活、轻便、协作。 简单:记账简单,只有收入、支出、转账三种类型;界面简单,只有4个功能页,分别是记账、报表、余额、历史;轻便:使用浏览器或钉钉可直接访问,跨设备多端记账…...
高二闲话 #1
高二生活还是如期而至了,写点高二闲话感觉太有道理了。不过我得先说明这篇文章的目的不是传播负能量,事实上我最近还是蛮积极的,只不过我无法回避这些我内心里的真实想法,而且感觉写出来很有意思,所以写一写。 如果让我用四个字来形容高二生活的话,我想说“其实还好”。 …...
dijkstra 学习笔记。
学习普及组算法。同学们,我们今天来学习基础 dijkstra。给一个序列,求总和前 \(k\) 小的子序列,分别输出它们的和。\(k,n\le 10^6\)。dijkstra 主要是用来解决一些“前 \(k\) 小/大”的问题的。具体地,我们将状态视为点,状态带权,则需要连一些满足偏序关系的边,使得“状…...
char与varchar类型
char类型 char varchar类型...